RoyYang

快乐工作,快乐生活!

导航

使用企业库(Enterprise Library)的DAAB模块(二)

学习企业库的第二天,发现了一个好东东,安装好企业库以后,从安装程序找到“Microsoft patterns & practices”->"Enterprise Library 3.1 - May 2007"->"Enterprise Library Documentation"。

这就是企业库的帮助文档,非常详细,对了解各个application block的设计、使用有很大的帮助。

 

其实DAAB是建立在ADO.NET上的,只是在后者的基础上进行了进一步的封装。本篇主要讨论一下在DAAB中如何完成ADO.NET中常见的任务。

 

  1. 使用IDataReader来得到多行结果集:
            string sql = "SELECT * FROM sales";

            Database db 
    = DatabaseFactory.CreateDatabase();

            
    using (IDataReader reader = db.ExecuteReader(CommandType.Text, sql))
            {
                GridView1.DataSource 
    = reader;
                GridView1.DataBind();
            }

    注意这里使用了using,即表示在reader对象使用完后,立即调用其close方法。在Database类中,大部分的方法都会使数据库的连接按时打开或者关闭,但是ExecuteReader例外。

    其实如果熟悉ADO.NET就很好理解了,SqlDataReader在close以前,都保持着和数据库的连接的,因此我们必须显式关闭reader对象,才能及时的关闭数据库连接。

    除了using,还可以使用try..catch..finally,在finally块中使用if(reader!=null) reader.Close();
  2. 使用DataSet得到多行结果集:

            Database db = DatabaseFactory.CreateDatabase();

            DbCommand dbCommand 
    = db.GetStoredProcCommand("GetProductsBySupplier");

            db.AddInParameter(dbCommand, 
    "@Supplier", DbType.String, "Exotic Liquids");

            DataSet ds 
    = db.ExecuteDataSet(dbCommand);

            GridView1.DataSource 
    = ds;
            GridView1.DataBind();

     

    GetProductsBySupplier的SQL脚本

     这里使用了DbCommand对象,来执行一个名为“GetProductsBySupplier”的存储过程,并且添加名为“@Supplier”的输入参数,最后调用Database的ExecuteDataSet方法来返回Dataset。


  3.  使用DataSet来更新数据库: 

            Database db = DatabaseFactory.CreateDatabase();

            DataSet ds 
    = new DataSet();
                    
            
    //调用存储过程,得到某一个supplier生产的所有产品
            DbCommand dbCommand = db.GetStoredProcCommand("GetProductsBySupplier");
            db.AddInParameter(dbCommand, 
    "@Supplier", DbType.String, "Exotic Liquids");

            
    //将存储过程返回的数据集存入dataset对象中。
            db.LoadDataSet(dbCommand, ds, "ProductsBySupplier");

            
    //修改每一行的UnitPrice
            DataTable dt = ds.Tables[0];
            
    foreach (DataRow row in dt.Rows)
            {
                row[
    "UnitPrice"= Convert.ToInt32(row["UnitPrice"]) - 2;
            }

            
    //调用存储过程,将dataset对象中包含的所有ProductName和UnitPrice传入
            DbCommand updateCommand = db.GetStoredProcCommand("UpdateUnitPricesByProduct");
            db.AddInParameter(updateCommand, 
    "@ProductName", DbType.String, "ProductName", DataRowVersion.Current);
            db.AddInParameter(updateCommand, 
    "@UnitPrice", DbType.Currency, "UnitPrice", DataRowVersion.Current);

            
    //更新数据库的相关行
            int rowsEffected = db.UpdateDataSet(ds, "ProductsBySupplier"null, updateCommand, null, UpdateBehavior.Standard);

            Response.Write(rowsEffected);
    UpdateUnitPricesByProduct的SQL脚本

 

 

 

 

posted on 2008-08-30 12:23  RoyYang  阅读(455)  评论(0编辑  收藏  举报