使用企业库(Enterprise Library)的DAAB模块(二)
学习企业库的第二天,发现了一个好东东,安装好企业库以后,从安装程序找到“Microsoft patterns & practices”->"Enterprise Library 3.1 - May 2007"->"Enterprise Library Documentation"。
这就是企业库的帮助文档,非常详细,对了解各个application block的设计、使用有很大的帮助。
其实DAAB是建立在ADO.NET上的,只是在后者的基础上进行了进一步的封装。本篇主要讨论一下在DAAB中如何完成ADO.NET中常见的任务。
- 使用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();
-
使用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。
-
使用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脚本