练习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 菜单命令,在代码中添加如下命名空间,在这之前请先添加对Data和Common两个程序集的引用,可以参考练习一。
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)
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/e73ec271146541b9ac494c5ef8a8e969.gif)
{
this.cmbCategory.Items.Clear();
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
// TODO: Use a DataReader to retrieve Categories
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
using (IDataReader dataReader = _db.ExecuteReader("GetCategories"))
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
{
// Processing code
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
while (dataReader.Read())
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
{
Category item = new Category(
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
dataReader.GetInt32(0),
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
dataReader.GetString(1),
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
dataReader.GetString(2));
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
this.cmbCategory.Items.Add(item);
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
}
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
}
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
if (this.cmbCategory.Items.Count > 0)
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
this.cmbCategory.SelectedIndex = 0;
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
}
重载的方法
Database.ExecuteReader,有一个字符串类型的参数,通过它来指定存储过程的名称,在这里我们不用做任何数据库连接方面的管理,但是在
DataReader使用完毕后释放很重要,这些都会由上面的代码来完成,当
DataReader释放后,数据库连接也将被关闭。
4
.在cmbCategory_SelectedIndexChanged方法中加入如下代码,它将根据我们选择的类别来读取对应的Product的集合。
private
void
cmbCategory_SelectedIndexChanged(
object
sender, System.EventArgs e)
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/e73ec271146541b9ac494c5ef8a8e969.gif)
{
this.dsProducts.Clear();
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
Category selectedCategory = (Category)this.cmbCategory.SelectedItem;
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
if (selectedCategory == null)
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
return;
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
// TODO: Retrieve Products by Category
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
_db.LoadDataSet(
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
"GetProductsByCategory",
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
this.dsProducts,
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
new string[] { "Products" },
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
selectedCategory.CategoryId);
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
}
在数据访问应用程序块中
Database类提供了两个关于
DataSet的方法
ExecuteDataSet和
LoadDataSet。
ExecuteDataSet返回一个新的
DataSet而
LoadDataSet则返回一个已经存在的
DataSet。
第五步 实现数据的更新
在btnSave_Click方法中加入如下代码,将会把所有的任何改动更新到数据库中去。
private
void
btnSave_Click(
object
sender, System.EventArgs e)
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/e73ec271146541b9ac494c5ef8a8e969.gif)
{
// TODO: Use the DataSet to update the Database
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
System.Data.Common.DbCommand insertCommand = null;
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
insertCommand = _db.GetStoredProcCommand("HOLAddProduct");
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
_db.AddInParameter(insertCommand, "ProductName",
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
DbType.String, "ProductName", DataRowVersion.Current);
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
_db.AddInParameter(insertCommand, "CategoryID",
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
DbType.Int32, "CategoryID", DataRowVersion.Current);
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
_db.AddInParameter(insertCommand, "UnitPrice",
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
DbType.Currency, "UnitPrice", DataRowVersion.Current);
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
System.Data.Common.DbCommand deleteCommand = null;
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
deleteCommand = _db.GetStoredProcCommand("HOLDeleteProduct");
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
_db.AddInParameter(deleteCommand, "ProductID",
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
DbType.Int32, "ProductID", DataRowVersion.Current);
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
_db.AddInParameter(deleteCommand, "LastUpdate",
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
DbType.DateTime, "LastUpdate", DataRowVersion.Original);
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
System.Data.Common.DbCommand updateCommand = null;
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
updateCommand = _db.GetStoredProcCommand("HOLUpdateProduct");
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
_db.AddInParameter(updateCommand, "ProductID",
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
DbType.Int32, "ProductID", DataRowVersion.Current);
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
_db.AddInParameter(updateCommand, "ProductName",
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
DbType.String, "ProductName", DataRowVersion.Current);
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
_db.AddInParameter(updateCommand, "CategoryID",
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
DbType.Int32, "CategoryID", DataRowVersion.Current);
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
_db.AddInParameter(updateCommand, "UnitPrice",
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
DbType.Currency, "UnitPrice", DataRowVersion.Current);
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
_db.AddInParameter(updateCommand, "LastUpdate",
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
DbType.DateTime, "LastUpdate", DataRowVersion.Current);
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
int rowsAffected = _db.UpdateDataSet(
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
this.dsProducts,
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
"Products",
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
insertCommand,
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
updateCommand,
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
deleteCommand,
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
UpdateBehavior.Standard);
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article410803/20241018/9d5bd1f354c1429abb65aad8b260f06c.gif)
}
在更新一个数据库时,需要对
DataTable的列和存储过程中的参数之间作一个映射,重载的方法
UpdateDataSet,它通过数据访问程序块自动执行更新事务,在这里
UpdateBehaviour是可以设置的,它有三种类型:
Transactional,
Continue,
Standard。
第六步 运行应用程序
选择Debug | Start Without Debugging菜单命令并运行应用程序,在Category下拉框中选择一个类别,观察如何加载和保存数据。
本文转自lihuijun51CTO博客,原文链接:http://blog.51cto.com/terrylee/67631
,如需转载请自行联系原作者