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. 运行范例程序,范例程序的运行界面如下:
     
     
  • 相关阅读:
    [转]PC客户端与Android服务端的Socket同步通信(USB)
    [转]Android手机通过socket与pc通信
    [转]异常:android.os.NetworkOnMainThreadException
    [转]使用openssl库实现RSA、AES数据加密
    朴素贝叶斯分类器
    关于Mysql数据库的注意点
    poj 2386 Lake Counting
    poj 3253 Fence Repair
    poj 3069 Saruman's Army
    pat1100. Mars Numbers (20)
  • 原文地址:https://www.cnblogs.com/maocs/p/1686184.html
Copyright © 2011-2022 走看看