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. 运行范例程序,范例程序的运行界面如下:
 
 
posted @ 2010-03-15 13:47  小个子猫  阅读(426)  评论(0编辑  收藏  举报