Enterprise Library – Data Access Application Block- Part 2
Enterprise Library for .Net Framework 3.5 – EntLib v4.1 是patterns & practices 小组为.NET Framework 3.5 开发一套企业库,目前最新版本为v4.1,共包括9个Application Block,包括数据访问(Data Access Application Block)、异常管理(Exception Handling Application Block)、数据验证(Validation Application Block)等等,对企业应用开发非常有帮助,也非常实用。
相关下载信息:
本文根据EntLib v4.1 的学习手册(Hands on Lab),演示数据访问存储过程及更新数据记录。
在开始之前,先要执行如下的SQL 脚本,创建相关的数据表和存储过程:Enterprise Library 4.1 HOL\CS\Data Access\exercises\ex02\DbSetup 目录下的Categories.sql 和 HOLSPs.sql。
1. 下面就可以打开项目 \Enterprise Library 4.1 HOL\CS\Data Access \exercises \ex02 \begin \DataEx2.sln 开始我们的工作了。
打开MainForm.cs 代码文件,添加对Namespace的引用:
using Microsoft.Practices.EnterpriseLibrary.Data;
同时在Form 中创建如下private Database变量:
private Database _db = DatabaseFactory.CreateDatabase("QuickStarts Instance");
2. 编写代码
在MainForm_Load 方法编写如下代码,调用GetCategories 存储过程,返回DataReader 数据对象,在using 语句块结束后,自动释放数据库连接。
private void MainForm_Load(object sender, System.EventArgs e)
{
this.cmbCategory.Items.Clear();
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;
}
下面的方法实现在Category下来列表框改变时,同步更新DataGrid中的产品记录。
private void cmbCategory_SelectedIndexChanged(object sender, System.EventArgs e)
{
this.dsProducts.Clear();
Category selectedCategory = (Category) this.cmbCategory.SelectedItem;
if (selectedCategory == null)
return;
_db.LoadDataSet("GetProductsByCategory",
this.dsProducts,
new string[] { "Products" },
selectedCategory.CategoryId);
}
Database类提供了2个方法填充DataSet,分别是ExecuteDataSet和LoadDataSet。 ExecuteDataSet方法返回一个新创建的DataSet 对象;LoadDataSet则填充一个现有的DataSet对象。上述的LoadDataSet方法传入的第一个参数是 GetProductsByCategory 存储过程的名称,第二个参数是待填充的DataSet变量,第三个参数是将存储过程返回的结果集映射到指定的一组表名,最后一个参数的传给存储过程的参数 值,这里为CategoryID。
接下来实现更新的方法,btnSave_Click 方法代码如下:
private void btnSave_Click(object sender, System.EventArgs e)
{
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);
}
在更新数据时,需要手动创建存储过程的外包层(Wrapper),建立数据表DataTable字段和存储过程参数的映射。Database类 的UpdateDataSet这一方法比较少调用,这里不深入介绍了。
3. 检查配置文件app.config
本范例程序的配置文件已经建立的,不过,可以检查一下数据库连接是否需要修改:
<?xmlversion="1.0"encoding="utf-8"?>
<configuration>
<configSections>
<sectionname="dataConfiguration"type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</configSections>
<dataConfigurationdefaultDatabase="QuickStarts Instance" />
<connectionStrings>
<addname="QuickStarts Instance"connectionString="Database=EntLibQuickStarts;Server=(local);Integrated Security=SSPI;"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
4. 运行范例程序,范例程序的运行界面如下: