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两个程序集的引用,可以参考练习一。
None.gif using  Microsoft.Practices.EnterpriseLibrary.Data;
2 .在窗体中加入如下私有域,后面将会在多个地方用到该数据库实例。
None.gif private  Database _db  =  DatabaseFactory.CreateDatabase( " QuickStarts Instance " );
3 .在MainForm_Load方法中加入如下代码
None.gif private   void  MainForm_Load( object  sender, System.EventArgs e)
None.gif
ExpandedBlockStart.gif
{
InBlock.gif    
this.cmbCategory.Items.Clear();
InBlock.gif
InBlock.gif    
// TODO: Use a DataReader to retrieve Categories
InBlock.gif

InBlock.gif    
using (IDataReader dataReader = _db.ExecuteReader("GetCategories"))
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif        
// Processing code 
InBlock.gif

InBlock.gif        
while (dataReader.Read())
InBlock.gif
ExpandedSubBlockStart.gif        
{
InBlock.gif            Category item 
= new Category(
InBlock.gif
InBlock.gif                dataReader.GetInt32(
0),
InBlock.gif
InBlock.gif                dataReader.GetString(
1),
InBlock.gif
InBlock.gif                dataReader.GetString(
2));
InBlock.gif
InBlock.gif            
this.cmbCategory.Items.Add(item);
InBlock.gif
ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockEnd.gif    }

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

4 .在cmbCategory_SelectedIndexChanged方法中加入如下代码,它将根据我们选择的类别来读取对应的Product的集合。
None.gif private   void  cmbCategory_SelectedIndexChanged( object  sender, System.EventArgs e)
None.gif
ExpandedBlockStart.gif
{
InBlock.gif    
this.dsProducts.Clear();
InBlock.gif
InBlock.gif    Category selectedCategory 
= (Category)this.cmbCategory.SelectedItem;
InBlock.gif
InBlock.gif    
if (selectedCategory == null)
InBlock.gif
InBlock.gif        
return;
InBlock.gif
InBlock.gif
InBlock.gif    
// TODO: Retrieve Products by Category
InBlock.gif

InBlock.gif    _db.LoadDataSet(
InBlock.gif
InBlock.gif        
"GetProductsByCategory",
InBlock.gif
InBlock.gif        
this.dsProducts,
InBlock.gif
ExpandedSubBlockStart.gif        
new string[] "Products" },
InBlock.gif
InBlock.gif        selectedCategory.CategoryId);
InBlock.gif
ExpandedBlockEnd.gif}
在数据访问应用程序块中 Database类提供了两个关于 DataSet的方法 ExecuteDataSet和 LoadDataSet。 ExecuteDataSet返回一个新的 DataSet而 LoadDataSet则返回一个已经存在的 DataSet。

 

第五步 实现数据的更新

btnSave_Click方法中加入如下代码,将会把所有的任何改动更新到数据库中去。
None.gif private   void  btnSave_Click( object  sender, System.EventArgs e)
None.gif
ExpandedBlockStart.gif
{
InBlock.gif    
// TODO: Use the DataSet to update the Database 
InBlock.gif

InBlock.gif    System.Data.Common.DbCommand insertCommand 
= null;
InBlock.gif
InBlock.gif    insertCommand 
= _db.GetStoredProcCommand("HOLAddProduct");
InBlock.gif
InBlock.gif    _db.AddInParameter(insertCommand, 
"ProductName",
InBlock.gif
InBlock.gif        DbType.String, 
"ProductName", DataRowVersion.Current);
InBlock.gif
InBlock.gif    _db.AddInParameter(insertCommand, 
"CategoryID",
InBlock.gif
InBlock.gif        DbType.Int32, 
"CategoryID", DataRowVersion.Current);
InBlock.gif
InBlock.gif    _db.AddInParameter(insertCommand, 
"UnitPrice",
InBlock.gif
InBlock.gif        DbType.Currency, 
"UnitPrice", DataRowVersion.Current);
InBlock.gif
InBlock.gif    System.Data.Common.DbCommand deleteCommand 
= null;
InBlock.gif
InBlock.gif    deleteCommand 
= _db.GetStoredProcCommand("HOLDeleteProduct");
InBlock.gif
InBlock.gif    _db.AddInParameter(deleteCommand, 
"ProductID",
InBlock.gif
InBlock.gif        DbType.Int32, 
"ProductID", DataRowVersion.Current);
InBlock.gif
InBlock.gif    _db.AddInParameter(deleteCommand, 
"LastUpdate",
InBlock.gif
InBlock.gif        DbType.DateTime, 
"LastUpdate", DataRowVersion.Original);
InBlock.gif
InBlock.gif    System.Data.Common.DbCommand updateCommand 
= null;
InBlock.gif
InBlock.gif    updateCommand 
= _db.GetStoredProcCommand("HOLUpdateProduct");
InBlock.gif
InBlock.gif    _db.AddInParameter(updateCommand, 
"ProductID",
InBlock.gif
InBlock.gif        DbType.Int32, 
"ProductID", DataRowVersion.Current);
InBlock.gif
InBlock.gif    _db.AddInParameter(updateCommand, 
"ProductName",
InBlock.gif
InBlock.gif        DbType.String, 
"ProductName", DataRowVersion.Current);
InBlock.gif
InBlock.gif    _db.AddInParameter(updateCommand, 
"CategoryID",
InBlock.gif
InBlock.gif        DbType.Int32, 
"CategoryID", DataRowVersion.Current);
InBlock.gif
InBlock.gif    _db.AddInParameter(updateCommand, 
"UnitPrice",
InBlock.gif
InBlock.gif        DbType.Currency, 
"UnitPrice", DataRowVersion.Current);
InBlock.gif
InBlock.gif    _db.AddInParameter(updateCommand, 
"LastUpdate",
InBlock.gif
InBlock.gif        DbType.DateTime, 
"LastUpdate", DataRowVersion.Current);
InBlock.gif
InBlock.gif    
int rowsAffected = _db.UpdateDataSet(
InBlock.gif
InBlock.gif        
this.dsProducts,
InBlock.gif
InBlock.gif        
"Products",
InBlock.gif
InBlock.gif        insertCommand,
InBlock.gif
InBlock.gif        updateCommand,
InBlock.gif
InBlock.gif        deleteCommand,
InBlock.gif
InBlock.gif        UpdateBehavior.Standard);
InBlock.gif
ExpandedBlockEnd.gif}
在更新一个数据库时,需要对 DataTable的列和存储过程中的参数之间作一个映射,重载的方法 UpdateDataSet,它通过数据访问程序块自动执行更新事务,在这里 UpdateBehaviour是可以设置的,它有三种类型: Transactional, Continue, Standard。

 

第六步 运行应用程序

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

 

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









本文转自lihuijun51CTO博客,原文链接:http://blog.51cto.com/terrylee/67631  ,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值