EntLib-DAAB操作指南

企业库EntLib-- Data Access Application Block DAABWeb开发操作指南

 

数据访问应用程序块(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方法。

   下面展示一下基类Database6种方法的代码实现   
  1. 1.       ExecuteDataSet
  2. 2.       LoadDataSet
  3. 3.       ExecuteReader
  4. 4.       ExecuteScalar
  5. 5.       ExecuteNonQuery
  6. 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的资料,在此我要谢谢他们带我入门 。

你可能感兴趣的:(lib)