zoukankan      html  css  js  c++  java
  • 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. 运行范例程序,范例程序的运行界面如下:
     
     
  • 相关阅读:
    分享诗集中国原创诗歌创作分享中心,欢迎博客园喜欢诗词的加入【诗词在线】
    转让上海水族馆票【吐血转让】08年10月有效【100¥】
    winform 里Control.Margin 属性到底是干嘛的?
    亚交联盟注册指南
    sqlserver 替换回车换行
    如何配置 imail 中域名的MX记录
    张良、萧何与韩信:汉初三杰悲情录[转]
    FBD内存全局缓冲内存 比dd2 ecc还要好啊。服务器内存和普通PC内存的区别[转载]
    脆弱的ASP.NET AJAX
    无法连接到服务器。 帐户: 'mail.bb.cn', 服务器: '*******', 协议: SMTP, 端口: 25, 安全(SSL): 否, 套接字错误: 10061, 错误号: 0x800CCC0E
  • 原文地址:https://www.cnblogs.com/maocs/p/1686184.html
Copyright © 2011-2022 走看看