Data Access Application Block简介
Data Access Application Block(DAAB)简化了常见数据访问功能的实现任务。应用程序可以在很多场合使用DAAB,例如读取数据用来显示,用过应用程序层传递数据,向数据库提交已修改的数据。DAAB同时支持存储过程和内嵌的SQL语句。普通的日常任务,例如管理数据库连接,创建和缓存参数等功能都已经封装在DAAB的方法中。所以说,DAAB提供了对 ADO.NET 最常用功能的访问,通过易于使用的类将其公开,这就大大的提升了开发者的效率。
ADO.NET 2.0提供了例如DbCommand和DbConnection等类,这些类帮助Data Provider实现了从特定数据库的抽象(也就是不依赖特定的数据库,方便移植)。DAAB 还利用这些类提供了一个模型,能够进一步的封装数据库类型相关的特性,例如参数发现和类型转换。正是由于这些,使得应用程序能够从一种数据库移植到另一种上,而无需修改客户端代码。
DAAB还包括了一些特定的类,这些类与MS SQL Server和Oracle相关联。这些类所作的操作都是针对特定的数据库类型(使用这些特定的类,可以使用对应数据库的某些特性,在某些方面可以提高性能)。
DAAB的另一个特性是在应用程序中能够通过连接字符串的名称来使用指定的数据库,例如“Pub”和“Northword”。而每个数据库连接信息保存在一个配置文件中。通过修改配置文件的设置信息。开发人员能使用不同的数据库配置而无需重新编译代码。
使用DAAB的一些好处:
¨ 它使用的是ADO.NET 2.0所提供的功能,故你也可以将DAAB与ADO.NET结合起来使用。
¨ 减少解决标准任务时所写的样板代码。
¨ 帮助维护数据访问的一致性,无论是跨应用程序还是跨企业。
¨ 能降低更换数据库类型的难度。
¨ 它能解放开发者,让其在更换数据库类型的时候无需要学习不同的编程模型。
¨ 还能减少在更换数据库时所需要编写的大量代码。
如何配置使用DAAB
在的项目中使用DAAB,你需要在项目中添加该应用程序块程序集的应用。同时你还需要熟悉Enterprise Library的命名空间和对象创建模式。
在项目中引用Enterprise Library命名空间
一般的情况下,你需要在项目中添加以下两个程序集的引用:
Microsoft.Practices.EnterpriseLibrary.Common.dll
Microsoft.Practices.EnterpriseLibrary.Data.dll.
在Visual Studio中,右键点击Sloution Explorer(解决方案资源管理器)中对应的项目,然后再弹出菜单中选择Add References(添加引用),参见图01。然后选择浏览页,找到您安装Enterprise Library的路径,在其下的BIN目录中找到上述的两个程序集文件。然后点击OK完成添加,参见图02。
1. 为项目添加一个应用程序配置文件(app.config),右键点击Sloution Explorer(解决方案资源管理器)中对应的项目,然后再弹出菜单中选择Add New Item...(添加新项目),然后选择Application Configuration file(应用程序配置文件)模板,参见图03。
2. 你需要使用Enterprise Library 配置工具来配置应用程序(其实就是用图形工具配置上一步骤添加的app.config)你可以通过开始菜单,然后在所有程序菜单里面找到Microsoft patterns & practices,选择里面的Enterprise Library Configuration,然后通过该工具打开app.config文件。
另外,你可以通过下面的步骤来配置在Visual Studio中直接调用工具编辑app.config文件。
3. 在解决方案资源管理器(Sloution Explorer)中用右键选择app.config文件,
选择Open With...(打开方式),参见图04:
4. 在添加程序的对话框中,选择EntLibConfig.exe,再输入一个自己喜欢的友好名字,点击确定,参见图05。现在我们就可以用过打开方式中刚添加的工具来对app.config进行配置。
5. 使用上述的方法对app.config 进行配置,参见图06。如果你发现如图中Connection Strings下已经有一个默认的数据库连接:LocalSQLServer。这是你电脑上machine.config文件中所预先配置的。该图右边的面板是左边选中节点的属性。
6. 现在你可以方便的添加自己的数据库连接,右键选择Data Access Application Block节点下的Connection Strings节点,在弹出的菜单中选择New -> Connection String,参见图07:
7. 选择Data Access Application Block -> Connection String 节点下,我们刚添加的节点,点击其Name属性,可以修改它的名称。我们把它改为:SampleDataBase,这个名字就是我们以后在代码里创建数据库连接时所要引用的名称。参见图8:
8. 选择DataBase节点,将其的Value属性改为:Northwind,这个属性是我们的数据库连接中需要使用的数据库名称。参见图09:
9. 下面接着设置数据库服务器,将其设置为:(local)\SQLExpress,如果你没有安装SQLExpress,而是使用其他的数据库,例如SQL Server 2000, 请输入对应的服务器地址。参见图10:
10.如果你的数据库使用Windows Authenication Mode来登录,则无需对剩下的参数做设置。如果是使用SQL 数据库的用户名密码登录,则需要添加UID、PWD参数,删除Integrated Security节点。
参见图11:
11.我们还要做一项配置,选择Data Access Application Block节点,然后为其选择defaultDataBase( 默认的数据库连接),参见图12:
12.现在配置完毕,选择File菜单中的Save Application,保存刚才所作的配置,然后关闭Enterprise Library Configuration工具。
开始编写代码
在当前项目中,打开Form1.vb,为它添加Enterprise Library的命名空间,还有访问数据库的命名空间。 在该文件的顶部添加如下语句:
VB.NET
Imports System.Data.Common
Imports Microsoft.Practices.EnterpriseLibrary.Data
C#
using System.Data.Common;
using Microsoft.Practices.EnterpriseLibrary.Data;
为了演示数据显示,我们需要在Form上添加一个DataGridView,如图13:
在Form的载入事件中添加数据库访问的代码,如下:
VB.NET
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim db As Database = DatabaseFactory.CreateDatabase
Dim SQL As String = "SELECT * FROM Employees"
Dim dbCommand As DbCommand = db.GetSqlStringCommand(SQL)
Dim ds As DataSet = db.ExecuteDataSet(dbCommand)
DataGridView1.DataSource = ds.Tables(0)
End Sub
C#
private void Form1_Load(object sender, System.EventArgs e)
{
Database db = DatabaseFactory.CreateDatabase;
string SQL = "SELECT * FROM Employees";
DbCommand dbCommand = db.GetSqlStringCommand(SQL);
DataSet ds = db.ExecuteDataSet(dbCommand);
DataGridView1.DataSource = ds.Tables(0);
}
运行程序,查看效果如下:
如果我们在上面的配置应用程序步骤中,添加了另外一个数据库连接AnotherDataBase(如图15),我们可以方便的在程序中访问它,只需要将上述代码中创建数据库实例的语句作如下的修改:
Dim db As Database = DatabaseFactory.CreateDatabase(“AnotherDataBase”)
在我们使用DAAB时,首先要遇到的是DataBase对象,该类的一些常用方法如下表所示:
方 法 | 说 明 |
GetSqlStringCommand | 根据给定的SQL语句,返回一个DBCommand |
GetStoredProcCommand | 根据给定的存储过程名称,返回一个DBCommand |
ExecuteDataSet | 执行SQL语句或存储过程,返回DataSet |
ExecuteNoQuery | 执行SQL语句或存储过程,返回操作的记录数 |
ExecuteReader | 执行SQL语句或存储过程,返回IDataReader |
ExecuteScalar | 执行SQL语句或存储过程,返回结果集中第一行第一列的数据 |
LoadDataSet | 根据给定的DBCommand或者其他参数,返回DataSet |
UpdateDataSet | 为DataSet中的记录执行相应的INSERT,UPDATE或DELETE |
在下面的内容中,我们介绍的例子将会涉及到该类的一些常用方法。
使用DAAB读取数据
上面我们已经知道了如何配置DAAB,以及使用DAAB的必要步骤。下面开始介绍用DAAB读取数据的几种常见方式。
使用DBDataReader获取数据
为了演示的方便,我们下面的例子将使用ASP.NET。在Visual Studio中新建一个WebSite,然后使用Enterprise Library Configuration工具来修改Web.config,为项目添加数据库连接的配置,具体配置参见本文的配置应用程序。
完成数据库配置之后,在页面中添加一个GridView控件。Default页面的Load事件中添加数据访问代码,参考如下:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim db As Database = DatabaseFactory.CreateDatabase
Dim SQL As String = " SELECT EmployeeID, FirstName, _
LastName FROM Employees "
Dim dbCommand As DbCommand = db.GetSqlStringCommand(SQL)
Using dbReader As IDataReader = db.ExecuteReader(dbCommand)
GridView1.DataSource = dbReader
GridView1.DataBind()
End Using
End Sub
使用DataSet获取数据
与上一个例子基本相同,只是使用了DataBase对象不同的方法,来获取数据。具体代码如下:
Private Sub LoadDataByDataSet()
Dim db As Database = DatabaseFactory.CreateDatabase()
Dim SQL As String = "SELECT EmployeeID, FirstName, LastName FROM Employees"
Dim dbCommand As DbCommand = db.GetSqlStringCommand(SQL)
Using ds As DataSet = db.ExecuteDataSet(dbCommand)
GridView1.DataSource = ds.Tables(0)
GridView1.DataBind()
End Using
End Sub
如果要调用存储过程来获取数据,只需要将SQL字符串改为存储过程的名称,然后调用DataBase的 GetStoredProcCommand可以获得DbCommand对象,其它的操作就和上面一样了。
使用带输出参数的存储过程
我们平时使用的存储过程,一般都是带参数的。在调用存储过程的时候之前,可以使用DataBase的AddInParameter方法来添加参数。从AddInParameter的名称上,我们就知道这是用来添加输入参数的方法。如果要使用输出参数,则需要用Database的AddOutParameter方法。下面用一个例子来演示调用存储过程的方法,这个例子是用名为”P_GetPagedUserList”的存储过程,用来读取分页的用户列表,它有一个参数RecordCount,为输出参数,表示总的记录数。因为在使用分页功能的时候,存储过程不会返回所有的记录,而是返回PageIndex指定页的记录,但是我们需要显示总的记录数与页数。所以这里使用一个输出参数来获取总的记录数。下面是简化后的代码:
Public Function GetPagedUserList(ByVal PageIndex As String, ByVal PageSize As Integer, ByRef RecordCount As Integer)) As Integer
Dim db As Database = DatabaseFactory.CreateDatabase
Dim dbCommand = db.GetStoredProcCommand("P_GetPagedUserList ")
db.AddInParameter(dbCommand, "PageIndex", DbType.Int16, PageIndex)
db.AddInParameter(dbCommand, "PageSize", DbType.Int16, PageSize)
db.AddOutParameter(dbCommand, "RecordCount", DbType.Int16, 10)
Dim ds As DataSet = db.ExecuteDataSet(dbCommand)
RecordCount = db.GetParameterValue(dbCommand, "RecordCount")
GridView1.DataSource = ds.Tables(0)
GridView1.DataBind()
Return RecordCount
End Function
使用DataSet来更新数据
在例如实现添加用户、修改用户密码等功能时,我们可以使用一句简单的SQL语句或存储过程来完成对数据库的操作,因为它们涉及的数据很少,只有最基本的内容,操作方式也简单,只需一句INSERT或UPDATE的SQL语句就可以完成。假如需要完成的数据操作比较复杂,例如:批量的更新记录,对几条记录更改后一次性的更新等相对繁琐的操作就可以借助DataSet来完成。下面的参考代码:
Public Function UpateWithDataSet() As Integer
Dim db As Database = DatabaseFactory.CreateDatabase()
Dim productsDataSet As DataSet = New DataSet()
Dim sqlCommand As String = "Select Select ProductID, ProductName, UnitPrice From Products "
Dim dbCommand As DbCommand = db.GetSqlStringCommand(sqlCommand)
Dim productsTable As String = "Products"
' 获取初始数据
db.LoadDataSet(dbCommand, productsDataSet, productsTable)
' 获取需要修改的数据表.
Dim table As DataTable = productsDataSet.Tables(productsTable)
' 修改原有的产品记录
table.Rows(0)("ProductName") = "Modified product"
' 删除一条产品记录
table.Rows(1).Delete()
' 添加一条产品记录
Dim addedRow As DataRow = table.Rows.Add(New Object() {DBNull.Value, "New product", 25})
' 构建 新增、修改、删除的 DbCommand
Dim insertCommand As DbCommand = db.GetStoredProcCommand("AddProduct")
db.AddInParameter(insertCommand, "ProductName", DbType.String, "ProductName", DataRowVersion.Current)
db.AddInParameter(insertCommand, "UnitPrice", DbType.Currency,
"UnitPrice", DataRowVersion.Current)
Dim deleteCommand As DbCommand = db.GetStoredProcCommand("DeleteProduct")
db.AddInParameter(deleteCommand, "@ProductID", DbType.Int32, "ProductID", DataRowVersion.Current)
Dim updateCommand As DbCommand = db.GetStoredProcCommand("UpdateProduct")
db.AddInParameter(updateCommand, "ProductID", DbType.Int32, "ProductID", DataRowVersion.Current)
db.AddInParameter(updateCommand, "ProductName", DbType.String, "ProductName", DataRowVersion.Current)
db.AddInParameter(updateCommand, "UnitPrice", DbType.Currency, "UnitPrice", DataRowVersion.Current)
' 提交DataSet, 获取更新的记录数.
Dim rowsAffected As Integer = db.UpdateDataSet(productsDataSet, "Products", insertCommand, updateCommand, _
deleteCommand, UpdateBehavior.Standard)
End Function
注:以上代码是Enterprise Library文档中的一段参考代码修改而来,未经过测试。
上述的代码为了说明如何使用DataSet来更新数据,混合了多个数据操作,并不代表实际的用途。
总结
到这里,我们已经介绍了DAAB的用途与优点,如何在项目中配置使用DAAB,还有使用DAAB访问数据的几种常用方法,希望对初次接触Enterprise Library的朋友会有所帮助。
上面涉及的一些程序片断,由于是从原始程序修剪而来,删除了异常处理等内容。
如果对您DAAB的使用有何疑问,或者心得,大家可以一起交流。
MSN: asp_lha@msn.com
下载PDF版本: 使用Data Access Application Block
--------------------------------------------
关于 Enterprise Library 的简介