Enterprise Library 2.0 Hands On Lab 翻译(2):数据访问程序块(二)

练习2:存储过程和使用程序块更新数据

该练习将示范如何用数据访问应用程序调用存储过程,并使用强类型的DataSet来更新数据。

 

第一步

打开DataEx2.sln项目,默认的安装路径应该为C:\Program Files\Microsoft Enterprise Library January 2006\labs\cs\Data Access\exercises\ex02\begin,并编译。

 

第二步 在QuickStarts数据库中添加Categories数据表

运行批处理文件SetUpEx02.bat,它默认的路径安装路径为C:\Program Files\Microsoft Enterprise Library January 2006\labs\cs\Data Access\exercises\ex02\DbSetup,默认的服务器实例为(local)\SQLEXPRESS,如果需要修改,用记事本打开SetUpEx02.bat,修改为自己的德数据库服务器实例。执行后将会在数据库中创建Categories数据表和存储过程GetCategories,并会在表中插入一些数据。

 

第三步 回顾应用程序

在解决方案管理器中,选中MainForm.cs文件,选择 View | Designer 菜单,应用程序主要是选择一个特定的Category,它将会加载该类别下的所有产品,允许我们作一些修改并保存。

 

第四步 实现数据的读取

1.在解决方案管理器中选择MainForm.cs,选择View | Code 菜单命令,在代码中添加如下命名空间,在这之前请先添加对DataCommon两个程序集的引用,可以参考练习一。

using Microsoft.Practices.EnterpriseLibrary.Data;

2.在窗体中加入如下私有域,后面将会在多个地方用到该数据库实例。

private Database _db = DatabaseFactory.CreateDatabase("QuickStarts Instance");

3.在MainForm_Load方法中加入如下代码

private void MainForm_Load(object sender, System.EventArgs e)

{
    
this.cmbCategory.Items.Clear();

    
// TODO: Use a DataReader to retrieve Categories

    
using (IDataReader dataReader = _db.ExecuteReader("GetCategories"))

    
{
        
// Processing code 

        
while (dataReader.Read())

        
{
            Category item 
= new Category(

                dataReader.GetInt32(
0),

                dataReader.GetString(
1),

                dataReader.GetString(
2));

            
this.cmbCategory.Items.Add(item);

        }


    }


    
if (this.cmbCategory.Items.Count > 0)

        
this.cmbCategory.SelectedIndex = 0;

}

重载的方法Database.ExecuteReader,有一个字符串类型的参数,通过它来指定存储过程的名称,在这里我们不用做任何数据库连接方面的管理,但是在DataReader使用完毕后释放很重要,这些都会由上面的代码来完成,当DataReader释放后,数据库连接也将被关闭。

4.在cmbCategory_SelectedIndexChanged方法中加入如下代码,它将根据我们选择的类别来读取对应的Product的集合。

private void cmbCategory_SelectedIndexChanged(object sender, System.EventArgs e)

{
    
this.dsProducts.Clear();

    Category selectedCategory 
= (Category)this.cmbCategory.SelectedItem;

    
if (selectedCategory == null)

        
return;


    
// TODO: Retrieve Products by Category

    _db.LoadDataSet(

        
"GetProductsByCategory",

        
this.dsProducts,

        
new string[] "Products" },

        selectedCategory.CategoryId);

}

在数据访问应用程序块中Database类提供了两个关于DataSet的方法ExecuteDataSetLoadDataSetExecuteDataSet返回一个新的DataSetLoadDataSet则返回一个已经存在的DataSet

 

第五步 实现数据的更新

btnSave_Click方法中加入如下代码,将会把所有的任何改动更新到数据库中去。

private void btnSave_Click(object sender, System.EventArgs e)

{
    
// TODO: Use the DataSet to update the Database 

    System.Data.Common.DbCommand insertCommand 
= null;

    insertCommand 
= _db.GetStoredProcCommand("HOLAddProduct");

    _db.AddInParameter(insertCommand, 
"ProductName",

        DbType.String, 
"ProductName", DataRowVersion.Current);

    _db.AddInParameter(insertCommand, 
"CategoryID",

        DbType.Int32, 
"CategoryID", DataRowVersion.Current);

    _db.AddInParameter(insertCommand, 
"UnitPrice",

        DbType.Currency, 
"UnitPrice", DataRowVersion.Current);

    System.Data.Common.DbCommand deleteCommand 
= null;

    deleteCommand 
= _db.GetStoredProcCommand("HOLDeleteProduct");

    _db.AddInParameter(deleteCommand, 
"ProductID",

        DbType.Int32, 
"ProductID", DataRowVersion.Current);

    _db.AddInParameter(deleteCommand, 
"LastUpdate",

        DbType.DateTime, 
"LastUpdate", DataRowVersion.Original);

    System.Data.Common.DbCommand updateCommand 
= null;

    updateCommand 
= _db.GetStoredProcCommand("HOLUpdateProduct");

    _db.AddInParameter(updateCommand, 
"ProductID",

        DbType.Int32, 
"ProductID", DataRowVersion.Current);

    _db.AddInParameter(updateCommand, 
"ProductName",

        DbType.String, 
"ProductName", DataRowVersion.Current);

    _db.AddInParameter(updateCommand, 
"CategoryID",

        DbType.Int32, 
"CategoryID", DataRowVersion.Current);

    _db.AddInParameter(updateCommand, 
"UnitPrice",

        DbType.Currency, 
"UnitPrice", DataRowVersion.Current);

    _db.AddInParameter(updateCommand, 
"LastUpdate",

        DbType.DateTime, 
"LastUpdate", DataRowVersion.Current);

    
int rowsAffected = _db.UpdateDataSet(

        
this.dsProducts,

        
"Products",

        insertCommand,

        updateCommand,

        deleteCommand,

        UpdateBehavior.Standard);

}

在更新一个数据库时,需要对DataTable的列和存储过程中的参数之间作一个映射,重载的方法UpdateDataSet,它通过数据访问程序块自动执行更新事务,在这里UpdateBehaviour是可以设置的,它有三种类型:TransactionalContinueStandard

 

第六步 运行应用程序

选择Debug | Start Without Debugging菜单命令并运行应用程序,在Category下拉框中选择一个类别,观察如何加载和保存数据。

 

更多Enterprise Library的文章请参考《Enterprise Library系列文章

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

posted on 2006-10-06 12:17 TerryLee 阅读(4624) 评论(12)  编辑 收藏 所属分类: Enterprise Library

评论

#1楼  2006-10-10 18:23 spider[匿名] [未注册用户]

在ado.net2.0中如何取到存储过程的返回值呢
Database db = DatabaseFactory.CreateDatabase("connection");
DbCommand cmd = db.GetStoredProcCommand("getList");
db.AddInParameter(cmd,"name", DbType.String,"spider");
db.AddOutParameter(cmd,"@count",DbType.Int16,4);
DataSet ds = db.ExecuteDataSet(cmd);
DataGridView1.DataSource = ds.Tables[0];
我想用那个count的返回值,怎样写呢?谢谢!   回复  引用    

#2楼  2006-10-10 19:04 spider[匿名] [未注册用户]

问题解决了。string result=db.GetParameterValue(cmd ,"@count").ToString();这样就搞定了。   回复  引用    

#3楼 [楼主] 2006-10-12 15:58 TerryLee      

@spider[匿名]
:)   回复  引用  查看    

#4楼  2008-06-20 14:14 yuanlm      

最后一段代码,又长又难写。大家有没有想过DataSet的数据提交通过动态生成SQL的方式实现?   回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-10-06 13:17 编辑过
 
另存  打印
 


导航

公告

  • 网名:TerryLee
  • 本名:李会军
  • 位置:中国北京 Ethos
  • 联系方式:
  • 访问我的个人主页

 MVP配置

 版权声明

  • 本站采用创作共用许可 署名,非商业

绿色通道

IT新闻

统计

与我联系

留言簿(322)

我的标签

随笔分类

随笔档案

个人站点

关注项目

好的网站

我的好友

搜索

积分与排名

阅读排行榜

评论排行榜