[转载]EntLib-DAAB操作指南 – .NET 程序花园 – 博客园.
数据访问应用程序块(Data Access Application Block)顾名思义是负责与数据打交道的应用程序块。DAAB并不是整个企业库的最低层,它依赖于企业库的最低层——配置管理程序块。现在简单使用企业库自带的配置工具(Enterprise Library Configuration)来完成DAAB的配置工作。
说到这里想再说些题外话,我们知道企业库是由相对独立Application Block演变而成的,在以前的DAAB我们可能会构建工厂方法模式通过静态方法创建数据库链接。但现在既然企业库已经出炉了,我们也遵循通过配置管理来得到数据库连接这种方法。
概括来说,使用DAAB可以抽象为三个步骤,分别是:
1. 配置DAAB;
2. 实例化数据库;
3. 具体数据操作;
第一部,创建配置信息。如前所述,企业库架构通过配置来创建数据库连接。我们可以使用企业库自带的配置工具(Enterprise Library Configuration)快捷、安全地完成配置工作。具体步骤如下:
准备工作:这步很重要,我们新建了一个Web工程,这个工程得先增加一个项(应用程序配置文件)。这样做是为了直接使用配置工具打开配置文件进行编辑,省去不并要的麻烦。
1.打开配置工具。(我的是XP系统,企业库版本为Enterprise Library – June 2005)开始菜单->所有程序->Microsoft patterns & practices->Enterprise Library – June 2005->Enterprise Library Configuration
2.打开应用程序。File->Open Application 选择工程所在目录下的App.config或web.config文件。
3.新建DAAB。右键点击刚建的Application->New->Data Access Application Block。
4.配置DAAB参数。这里内容太多,只说说其中几个常用的配置项。
4.1首先是数据库实例名称,在“Database Instances”节点下,默认为我们建立了名叫“Database Instance1”的实例名,这个名将用于在程序中创建数据库实例,请改成具有标识性的名字。
4.2其次是连接字符串,在“Connection Strings ”节点下,默认也会创造一个,同样,我们也可以改一下名。连接字符串中“Integrated Security”的值默认为True,代表用Windows集成认证(不需要用户名和密码属性),如果我们要用混合认证方式,就要先把值设为False,然后再在所在Connection String中增加用户名和密码两个属性并填充正确的属性值(方法:在具体Connection String节点上右键->New …)。一切就绪便可以确认保存了。
第二部,便是创造数据库实例了。
准备工作:需要把企业库引用到工程中。因为企业库是开源的,所以我们可以直接引用工程或者引用编译好的DLL。为了说明怎样使用,这里只引用两个关键程序集,分别是Microsoft.Practices.EnterpriseLibrary.Configuration.dl和Microsoft.Practices.EnterpriseLibrary.Data.dll。另外为了简化代码的编写,我们再在需要用到DAAB的地方using一下Microsoft.Practices.EnterpriseLibrary.Data这个命名空间。
当我们需要执行数据库操作前,需要创建数据库实例。使用以下语句:
Database db = DatabaseFactory.CreateDatabase(“Northwind”);
就这一条语句便完成了数据库的连接操作!不过要注意,这里的Northwind是上一部配置工作中所述的数据库实例名称,而不是要连接的数据库名。数据库名是在数据库实例里的ConnectionStringNode属性所指向的ConnectionString中,和服务器名,用户名,及密码一起定义的。请把这个关系理清。
另外,Database 的实例,在生命周期内维护着数据库的连接。即当从工厂生产一个数据库实例时,其内部即封闭了ADO.NET Connection的open方法;而当其生命周期结束后(假定在一对花括号内),它将自动调用close方法关闭连接。
第三部,具体数据库操作。
我们以一具体实例来介绍一下数据库操作:
1.增加对Microsoft.Practices.EnterpriseLibrary.Data.dll和Microsoft.Practices.EnterpriseLibrary.Configuration.dll的引用,并在代码在添加:
using Microsoft.Practices.EnterpriseLibrary.Data;
2.编写存储过程,第二部完成之后在我们工程所要用到的数据库里建立存储过程;
CREATE PROCEDURE GetProductDetails
@ProductID int, //默认为INPUT
@ProductName nvarchar(40) OUTPUT,
@UnitPrice money OUTPUT,
@QtyPerUnit nvarchar(20) OUTPUT
AS
SELECT @ProductName = ProductName,
@UnitPrice = UnitPrice,
@QtyPerUnit = QuantityPerUnit
FROM Products
WHERE ProductID = @ProductID.
4.建立DBCommandWrapper来调用用存储过程GetProductDetails :
string sqlCommand = "GetProductsDetails";
DBCommandWrapper dbCommandWrapper = db.GetStoredProcCommandWrapper(sqlCommand);
dbCommandWrapper.AddInParameter("@ProductID", DbType.Int32, productID);
//把productID的value传递给@ProductID
dbCommandWrapper.AddOutParameter("@ProductName", DbType.String, 50);
//输出的参数 50代表参数的大小。
dbCommandWrapper.AddOutParameter("@UnitPrice", DbType.Currency, 8);
5.执行存储过程:
db.ExecuteNonQuery(dbCommandWrapper);
6.得到输出参数的值:
string results = string.Format(
CultureInfo.CurrentCulture, "{0}, {1}, {2:C} ",
dbCommandWrapper.GetParameterValue("@ProductID"),
dbCommandWrapper.GetParameterValue("@ProductName"),
dbCommandWrapper.GetParameterValue("@UnitPrice"));
txtResult.Text = results;
为了执行存储过程,上述代码使用GetStoredProcCommandWrapper方法创建合适的command wrapper对象,然后作为参数传递给ExecuteNonQuery方法。
下面展示一下基类Database的6种方法的代码实现 :
1. ExecuteDataSet
2. LoadDataSet
3. ExecuteReader
4. ExecuteScalar
5. ExecuteNonQuery
6. UpdateDataSet
(1) ExecuteDataSet方法
Database db = DatabaseFactory.CreateDatabase();
DataSet dsCustomers = db.ExecuteDataSet(CommandType.Text, “Select * From Customers” );
customerGrid.DataSource = dsCustomers.Tables[0];
(2) ExecuteReader方法
Database db = DatabaseFactory.CreateDatabase();
string SQLCommand = “Select top 5 * From Customers”;
DBCommandWrapper dbCommandWrapper = db.GetSQLStringCommandWrapper(sqlCommand);
StringBuilder readerData = new StringBuilder();
using (IDataReader dataReader = db.ExecuteReader(dbCommandWrapper))
{
while (dataReader.Read())
{
readerData.Append(dataReader[“ContactName”]);
readerData.Append(Environment.NewLine);
}
}
txtResult.Text = readerData.ToString();
为了执行SQL语句,上述代码使用GetSqlStringCommandWrapper方法创建合适command wrapper对象,然后作为参数传递给ExecuteReader方法。
(3) ExecuteNonQuery方法前面已经介绍过了(略)
(4) ExecuteScalar方法
Database db = DatabaseFactory.CreateDatabase();
string sqlCommand = “GetProductName”;
int productID=1;
DBCommandWrapper dbCommandWrapper db.GetStoredProcCommandWrapper(sqlCommand, productID);
//单值传参productID, dbCommandWrapper.AddInParameter("@ProductID", DbType.String, productID)也可实现 。
// Retrieve ProdcutName. ExecuteScalar returns an object, so
// we cast to the correct type (string).
string productName = (string) db.ExecuteScalar(dbCommandWrapper);
txtResult.Text = productName;
Note : 其他方法实现请参阅MSDN帮助文档。总结了博客园几位高手关于EntLib的资料,在此我要谢谢他们带我入门 。