此主题描述了如何使用数据访问应用程序块开发应用程序。首先解释了如何配置应用程序块并将它添加到应用程序中。然后,在关键场景中,解释了如何在特定场景中使用应用程序块,例如获取单个项或者使用 DataSet 对象获取多行。最后,在开发任何细节中,给出了关于如连接管理、参数处理和处理异常等方面的更多信息。本主题假设使用的是原始的应用程序块,即没有扩展的。(要学习如何添加功能,请参见扩展和修改数据访问应用程序块。)
所有应用程序块都是源代码形式发布的,在使用快速入门和配置控制台之前必须进行编译。要学习如何编译 Enterprise Library 源代码,请参见构建 Enterprise Library 。
2.1 - 输入配置信息
下面这些过程展示了如何配置数据访问应用程序块。此过程解释了如何配置数据访问应用程序块。与节点关联的属性显示在右边的面板里。
添加数据访问应用程序块
- 打开配置文件。更多信息,请参数配置应用程序块。
- 右单击Application Configuration,指向 New ,然后单击 Data Access Application Block。
下一过程解释了如何配置默认的数据库实例,此实例在应用程序调用不指定实例名称的 DatabaseFactory.CreateDatabase 方法时使用。
配置默认数据库
- 在右面板中,展开 DefaultDatabase 属性。
- 为 DefaultDatabase 属性输入连接字符串的名称或者从下拉列表中选择它。默认的连接字符串名称是 ConnectionString 。
- (可选的)输入一个新的名称来设计 Name 属性,默认名称是 ConnectionString。
- 在 ProviderName 属性节,如果愿意,可能修改提供程序的名称。输入提供程序的名称或者从下拉列表中选择它。提供程序的默认名称是 System.Data.SqlClient 。ProviderName 属性必须是一个在 DBProviderFactory 类中指定的提供程序的名称。
下一过程解释了如何为命名数据库实例创建连接字符串。当配置控制台保存连接字符串时,它生成了一个以 name = value 格式保存值对的以分号分割的字符串。例如,如果使用配置控制台来用默认值生成连接字符串,配置控制台台将生成下列连接字符串。
Database=Database;Server=(local)"SQLEXPRESS;Integrated Security=SSPI;
配置连接字符串
- 单击 ConnectionString 节点。
- (可选的)输入一个新的名称以设置 Name 属性,这是 ConnectionString 节点的名称。默认的名称是 ConnectionString 。
- (可选的)在 ProviderName 属性节,修改提供程序的名称。输入提供程序的名称或者从下拉列表中选择它。默认的提供程序的名称是 System.Data.SqlClient 。ProviderName 属性必须是一个指定在 DbProviderFactory 类中的提供程序的名称。
- 用下列值更新 ConnectionString 属性。
Database=Database;Server=(local)"SQLEXPRESS;Integrated Security=SSPI
下一过程展示了如何配置一个 SQL Server CE 数据库。如果应用程序总是使用在配置期间命名的单一文件,这些步骤是合适的。关于 SQL Server CE 的更多信息,请参见创建数据库对象的细节。
配置 SQL Server CE
- 右单击 Custom Provider Mappings,指向 New ,然后单击 Provider Mapping 。
- 在属性面板中单击 TypeName 属性。单击省略号(...)按钮。
- 在 Type Selector 中,找到并双击 SqlCeDatabase 。
- 在 ConnectionStrings 节点上右单击并单击 New ,然后单击 Connection String 。
- (可选的)输入新的名称以设置 Name 属性。这是 ConnectionString 节点的名称。默认的名称是 ConnectionString 。
- 在 ProviderName 属性节,修改提供程序的名称为 Microsoft.SqlServerCe.Client 。
- 在 ConnectionString 属性节,输入理想的 SQL Server CE 连接字符串,例如:
Data Source='C:"MyApp"MyDatabase.sdf'
下一过程展示了如果添加 Oracle 包。Oracel 包服务是分组存储过程到普通组的一种方式,通常基于它们的功能。当应用程序调用在包中的 Oracle 存储过程时,代码必须用包名做为存储过程的前缀。例如,要调用在命名为 Employee_pkg 的包中的名为 GetEmployeeName 的过程,将调用 Employee_pkg.GetEmployeeName 。
将 这段代码加入到应用程序中将降低可移植性,因为语法专用于 Oracle 。另一种替换做法是,数据访问应用程序块会用包名做为存储过程的前缀。这意味着客户端代码在调用存储过程时不需要指定包名。要做到这一点,应用程序块使用 在配置文件中的信息。OraclePackage 节点保存了一个名称/前缀对。名称是包的名称,前缀是一个与包相关的字符串。所有以指定的前缀开始的存储过程都假定在相关的包内。
当应用程序调用一个存储过程时,数据访问应用程序块检查看是否以配置文件中的某个前缀开始。如果是,应用程序块为存储过程加上相应的包名前缀。(应用程序块将使用找到的第一个匹配)。如果指定一个星号(*)为前缀,关联包将用于所有存储过程。
配置 Oracle 包
- 右单击 ConnectionString ,指向 New ,然后单击 OraclePackages 。
- 单击 OraclePackage 。
- 输入 Oracle 包的名称以修改 Name 属性。默认为 OraclePackage 。
- 输入 Prefix 属性的值。
下一过程解释了如何通过关联提供程序和数据库全名称来添加自定义的提供程序映射。
配置自定义的提供程序
- 右单击 CustomProviderMappings 节点,指向 New ,然后单击 ProviderMapping 。
- (可选的)输入新的名称以设置 Name 属性。输入提供程序的名称或从下拉列表中选择。默认的提供程序是 System.Data.SqlClient 。ProviderName 属性必须是一个在 DbProviderFactory 类中指定的提供程序名称。
- 在 TypeName 属性节中。单击省略号按钮(...)并使用'Type Selector 选择 Enterprise Library 数据库类型的全名称。
使用提示
在这有二点关于配置文件的要记住。
- 在 使用配置控制台打开已存在的包含数据访问应用程序块的应用程序配置文件时,它会显示存储于 Machine.config 文件中的连接字符串。虽然配置控制台的 GUI 接口允许编辑连接串,配置控制台无法修改 Machine.config 文件,而且所做的修改也不会起作用。配置控制台仅保存存储在应用程序配置文件中的连接字符串的修改。
- 配置文件是不加密的。配置文件可能包含关于连接字符串、用户标识、密码、数据库服务器和分类的敏感信息。可以使用加密技术来保护这些信息拒绝未授权的读写操作。关于加密配置文件的信息,请参见配置应用程序块。
2.1.1 - 数据访问应用程序块的源模式
本主题列出了用于配置数据访问应用程序块的 XML 元素和属性。可以手工编辑 XML 数据,但 Enterprise Library 极大的简化了此任务。如果选择手工编辑 XML ,则要使用包含在本主题中的模式信息。配置文件有如下的节处理程序声明:
<configSections>
<section name="dataConfiguration"
type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings,
Microsoft.Practices.EnterpriseLibrary.Data, Version=3.1.0.0, Culture=neutral, PublicKeyToken=null" />
<section name="oracleConnectionSettings"
type="Microsoft.Practices.EnterpriseLibrary.Data.Oracle.Configuration.OracleConnectionSettings,
Microsoft.Practices.EnterpriseLibrary.Data, Version=3.1.0.0, Culture=neutral, PublicKeyToken=null" />
</configSections>
节处理程序声明包括配置设置节的名称和处理节中配置数据的节处理程序的类名。第一个配置设计节的名称为 dataConfiguration ,节处理程序的类名为 DatabaseSettings (在 Microsoft.Practices.EnterpriseLibrary.Data.Configuration 命名空间中)。
第二个配置设置节是 oracleConnectionSettings 。节处理程序类的名称为 OracleConnectionSettings (在 Microsoft.Practices.EnterpriseLibrary.Data.Oracle.Configuration 命名空间中 )。
connectionStrings 元素
connectionStrings 元素列出了可被应用程序使用的数据库连接,此元素不是必须的。
属性和子元素
下面的节描述了 connectionStrings 元素的属性和子元素。
add 子元素
add 元素是 connectionStrings 元素的子元素。add 元素添加一个数据库连接,此元素不是必须的,可以有多个 add 元素。
属性
表 1 列出了 add 元素的属性。
| 属性 | 描述 |
|---|---|
| name | 由应用程序访问的数据库实例的逻辑名称。在节中,名称必须是唯一的。此属性是必须的。 |
| providerName | 提供程序的名称。默认情况下,提供程序的名称定义在 Machine.config 文件中。providerName 名称必须是一个在 DBProviderFactory 类中指定的提供程序的名称。此属性是必须的。 |
| connectionString | 可用于被选的提供程序的连接字符串,此属性是必须的。 |
dataConfiguration 元素
元素仅在需要指定一个默认数据库或者自定义的提供程序的映射时有用。
属性
表 2 列出了 dataConfiguration 元素的属性。
| 属性 | 描述 |
|---|---|
| defaultDatabase | 连接字符串实例的名称,此实例仅用于应用程序调用不带实例名的 DatabaseFactory.CreateDatabase 方法。 |
providerMappings 子元素
这是一个 dataConfiguration 元素的子元素,只有在通过派生自 ADO.NET 的 Database 类而不是 GenericDatabase 类的提供程序时才需要指定提供程序的映射。SQL Server 和 Oracle 数据库默认已配置,所以不需要再在此节中指定。指定在此节中的一个数据库示例是 SQL Server CE 。
add 子元素
add 是 providerMappings 元素的子元素。add 元素添加一个数据库连接。此元素不是必须的,可以有多个 add 元素。
属性
表 3 列出了 add 元素的属性
| 属性 | 描述 |
|---|---|
| databaseType | 派生自 Database 类的类型名,此属性是必须的。 |
| name | 使用的 ADO.NET 提供程序类型名称。名称必须在 DBProviderFactory 类中指定。此属性是必须的。 |
oracleConnectionSettings
只有在需要指定 Oracle 数据库包映射时才需要此元素。
add 子元素
add 元素是 oracleConnectionSettings 元素的子元素。add 元素添加一个 Oracle 连接字符串实例。此元素不是必须的。可以有多个 add 元素。
属性
表 4 列出了 add 元素的属性
| 属性 | 描述 |
|---|---|
| name | Oracle 连接字符串实例的名称。此属性是必须的。 |
packages 子元素
这是 add 元素的一个子元素,指定一个 Oracle 的包。此元素是必须的。
add 子元素
这是 packages 元素的一个子元素。 add 元素添加一个 Oracle 的包。此元素不是必须的。可以有多个 add 元素。
属性
表 5 列出了 add 子元素的属性。
| 属性 | 描述 |
|---|---|
| Name | Oracle 包的名称。此属性是必须的。 |
| Prefix | Oracle 包的前缀。此属性是必须的。 |
2.2 - 添加应用程序代码
数据访问应用程序块为支持绝大多数访问数据库场景而设计。在添加自己的应用程序代码时,请参考在关键场景节中的场景,然后选择一种与自己的情况最匹配的方法。使用场景中的代码,或者如果需要,修改它以适合自己的需要。首先,必须准备自己的应用程序以使用数据访问应用程序块。
准备应用程序
- 添加到数据访问应用程序块程序集的引用。在 Visual Studio 中,在解决方案管理器中右单击项目节点,然后单击添加引用。单击浏览标签,然后导航到 Microsoft.Practices.EnterpriseLibrary.Data.dll 的位置。选择程序集,然后单击确定以添加引用。
- 按同样的步骤,添加到 Enterprise Library 内核程序集 Microsoft.Practices.EnterpriseLibrary.Common.dll 和 Microsoft.Practices.ObjectBuilder.dll 的引用。
- (可选的) 要不带完整的精确的元素引用使用来自加密应用程序块的元素,可以添加下列的 using 语句(C#)或者 Imports 语句(Visual Basic)到源代码文件的顶部。
C#
using Microsoft.Practices.EnterpriseLibrary.Data;
using System.Data;
Visual Basic
Imports Microsoft.Practices.EnterpriseLibrary.Data
Imports System.Data
注意:对于 Visual Basic 项目,可以使用项目设计器的引用页来管理引用和导入命名空间。要访问引用页,在解决方案浏览器中选择项目节点,在项目菜单中单击属性。在项目设计器出现时,单击引用标签。
创建 Database 对象
所有数据访问方法都相对于 Database 的对象。可以使用 DatabaseFactory 来创建 Database 对象。由工厂生成的 Database 对象的特定类型是由应用程序的配置信息决定的。
可以使用配置控制台指定一个默认的数据库实例。在不传递数据库实例名调用 CreateDatabase 方法时,DatabaseFactory 创建由默认实例指定的 database 。下列应用程序代码展示了如何创建一个默认实例的 Database 对象。
C#
Database db = DatabaseFactory.CreateDatabase();
Visual Basic
Dim db As Database = DatabaseFactory.CreateDatabase()
另一种方法是,应用程序代码可以指定一个命名的数据库实例。例如,如果使用配置控制台创建了名为 "Sales" 的实例,则为特定实例创建 Database 对象的代码可能如下。
C#
Database db = DatabaseFactory.CreateDatabase("Sales");
Visual Basic
Dim db As Database = DatabaseFactory.CreateDatabase("Sales")
如果要创建的数据库的连接字符串是已知的,也要以放弃应用程序的配置信息,而是使用构造函数直接创建 Database 对象。因为 Database 类是一个抽象基类,所以必须构建一个它的派生类型。派生的 Database 类型决定了 ADO.NET 数据提供程序。例如,SqlDatabase 类使用 SqlClientFactory 提供程序,SqlCeDatabase 使用 SqlCeProviderFactory 提供程序,以及 OracleDatabase 使用 OracleClientFactory 提供程序。为连接字符串构建正确类型的 Database 类是你的责任。
下列代码使用提供的连接字符串创建了一个 SqlDatabase 对象。
C#
// Assume the method GetConnectionString exists in your application and
// returns a valid connection string.
string myConnectionString = GetConnectionString();
SqlDatabase sqlDatabase = new SqlDatabase(myConnectionString);
Visual Basic
' Assume the method GetConnectionString exists in your application and
' returns a valid connection string.
Dim myConnectionString As String = GetConnectionString()
Dim db As SqlDatabase = New SqlDatabase(myConnectionString)
如果通过不是 ADO.NET SQL 数据提供程序或者 Oracle 数据提供程序的数据提供程序使用一个连接字符串,可以创建一个 GenericDatabase 对象。在创建 GenericDatabase 对象时,必须支持 DbProviderFactory 对象。
选择适当的重载方法
每个数据访问方法都有多个重载。下列描述和指南可以帮助你选择合适的重载:
- 有可以接受 ADO.NET 2.0 DbCommand 对象的重载。这些重载为每个方法提供了最大的灵活性和控制。
- 有接受存储过程名称和用于存储过程参数值的值集合的重载。这些重载在应用程序调用仅有输入参数的存储过程时比较方便。
- 有接受 System.Data.CommandType 和表示命令的字符串的重载。这些方便的重载在应用程序执行不带参数的内联 SQL 语句或存储过程时使用。
- 最后,以上每个重载都包含一个接受一个事务的重载。这允许在一个已存在的事务中执行方法时使用需要的重载类型。
每个关键场景示范了特定方法可用重载之一,许多场景都可以使用其他可用的重载完成。