2023年6月21日发(作者:)

SqlHelp使⽤指南(转)摘要:Data Access Application Block 是⼀个 .NET 组件,包含优化的数据访问代码,可以帮助⽤户调⽤存储过程以及向 SQL Server 数据库发出 SQL ⽂本命令。它返回 SqlDataReader、DataSet 和 XmlReader 对象。您可以在⾃⼰的 .NET 应⽤程序中将其作为构造块来使⽤,以减少需要创建、测试和维护的⾃定义代码的数量。您可以下载完整的 C# 和 Visual Basic .NET 源代码以及综合⽂档。

简介您是否正在从事 .NET 应⽤程序数据访问代码的设计和开发?您是否觉得⾃⼰总是在反复编写相同的数据访问代码?您是否曾经将数据访问代码包装在 Helper 函数中,以便能够在⼀⾏中调⽤存储过程?如果是,那么 Microsoft® Data Access Application Block for .NET 正是为您设计的。Data Access Application Block 将访问 Microsoft SQL Server™ 数据库的性能和资源管理⽅⾯的最佳经验封装在⼀起。您可以很⽅便地在⾃⼰的 .NET 应⽤程序中将其作为构造块使⽤,从页减少了需要创建、测试和维护的⾃定义代码的数量。尤其是,Data Access Application Block 可以帮助您:

调⽤存储过程或 SQL ⽂本命令。

指定参数详细信息。

返回 SqlDataReader、DataSet 或 XmlReader 对象。

例如,在引⽤了 Data Access Application Block 的应⽤程序中,您可以简单地在⼀⾏代码中调⽤存储过程并⽣成 DataSet,如下所⽰:[Visual Basic]Dim ds As DataSet = eDataset( _connectionString, _Procedure, _"getProductsByCategory", _new SqlParameter("@CategoryID", categoryID))[C#]DataSet ds = eDataset(

connectionString,Procedure,"getProductsByCategory",new SqlParameter("@CategoryID", categoryID));

注意: Application Block for .NET(⽤于 .NET 的应⽤程序块)是基于对成功的 .NET 应⽤程序进⾏详细研究⽽设计的。它以源代码的形式提供,您可以原样使⽤,也可以针对⾃⼰的应⽤程序进⾏⾃定义。该应⽤程序块并不代表未来 Microsoft 程序库的发展⽅向。Microsoft 程序库是为在各种使⽤情况下实现对数据访问⾏为的精确控制⽽建⽴的。将来的 版本可能会使⽤不同的模型来实现这个⽅案SqlHelper 类提供了⼀组静态⽅法,可以⽤来向 SQL Server 数据库发出许多各种不同类型的命令。SqlHelperParameterCache 类提供命令参数缓存功能,可以⽤来提⾼性能。该类由许多 Execute ⽅法(尤其是那些只运⾏存储过程的重写⽅法)在内部使⽤。数据访问客户端也可以直接使⽤它来缓存特定命令的特定参数集。使⽤ SqlHelper 类执⾏命令SqlHelper 类提供了五种 Shared (Visual Basic) 或 static (C#) ⽅法,它们是:ExecuteNonQuery、ExecuteDataset、ExecuteReader、ExecuteScalar 和 ExecuteXmlReader。实现的每种⽅法都提供⼀组⼀致的重载。这提供了⼀种很好的使⽤ SqlHelper 类来执⾏命令的模式,同时为开发⼈员选择访问数据的⽅式提供了必要的灵活性。每种⽅法的重载都⽀持不同的⽅法参数,因此开发⼈员可以确定传递连接、事务和参数信息的⽅式。类中实现的所有⽅法都⽀持以下重载:[Visual Basic]Execute* (ByVal connection As SqlConnection, _ByVal commandType As CommandType, _ByVal CommandText As String)Execute* (ByVal connection As SqlConnection, _ByVal commandType As CommandType, _ByVal commandText As String, _ByVal ParamArray commandParameters() As SqlParameter)Execute* (ByVal connection As SqlConnection, _ByVal spName As String, _ByVal ParamArray parameterValues() As Object)Execute* (ByVal transaction As SqlTransaction, _ByVal commandType As CommandType, _ByVal commandText As String)Execute* (ByVal transaction As SqlTransaction, _ByVal commandType As CommandType, _ByVal commandText As String, _ByVal ParamArray commandParameters() As SqlParameter)Execute* (ByVal transaction As SqlTransaction, _ByVal spName As String, _ByVal ParamArray parameterValues() As Object)[C#]Execute* (SqlConnection connection, CommandType commandType,

string commandText)Execute* (SqlConnection connection, CommandType commandType,string commandText, params SqlParameter[] commandParameters)Execute* (SqlConnection connection, string spName,

params object[] parameterValues)Execute* (SqlConnection connection,

CommandType commandType, string commandText)Execute* (SqlConnection connection,CommandType commandType, string commandText,

params SqlParameter[] commandParameters)Execute* (SqlConnection connection,string spName, params object[] parameterValues)除这些重载以外,除 ExecuteXmlReader 之外的其他⽅法还提供了另⼀种重载:允许将连接信息作为连接字符串⽽不是连接对象来传递,如下⾯的⽅法签名所⽰:[Visual Basic]Execute* (ByVal connectionString As String, _ByVal commandType As CommandType, _ByVal commandText As String)Execute* (ByVal connectionString As String, _ByVal commandType As CommandType, _ByVal commandText As String, _ByVal ParamArray commandParameters() As SqlParameter)Execute* (ByVal connectionString As String, _ByVal spName As String, _ByVal ParamArray parameterValues() As Object)[C#]Execute* (string connectionString, CommandType commandType,

string commandText)Execute* (string connectionString, CommandType commandType,

string commandText,

params SqlParameter[] commandParameters)Execute* (string connectionString, string spName,

params object[] parameterValues)注意: ExecuteXmlReader 不⽀持连接字符串,因为:与 SqlDataReader 对象不同,XmlReader 对象在 XmlReader 关闭时没有提供⾃动关闭连接的⽅法。如果客户端传递了连接字符串,那么当客户端完成对 XmlReader 的操作后,将⽆法关闭与 XmlReader 相关联的连接对象。通过参考 Data Access Application Block 程序集并导⼊ 命名空间,您可以轻松编写使⽤任何⼀种SqlHelper 类⽅法的代码,如下⾯的代码⽰例所⽰:[Visual Basic]Imports [C#]using ;导⼊命名空间后,您可以调⽤任何 Execute* ⽅法,如下⾯的代码⽰例所⽰:[Visual Basic]Dim ds As DataSet = eDataset( _"SERVER=(local);DATABASE=Northwind;INTEGRATED SECURITY=True;",_, "SELECT * FROM Products")[C#]DataSet ds = eDataset(

"SERVER=DataServer;DATABASE=Northwind;INTEGRATEDSECURITY=sspi;", _, "SELECT * FROM Products");使⽤ SqlHelperParameterCache 类管理参数SqlHelperParameterCache 类提供了三种可以⽤来管理参数的公共共享⽅法。它们是:

CacheParameterSet。⽤于将 SqlParameters 数组存储到缓存中。

GetCachedParameterSet。⽤于检索缓存的参数数组的副本。

GetSpParameterSet。⼀种重载⽅法,⽤于检索指定存储过程的相应参数(⾸先查询⼀次数据库,然后缓存结果以便将来查询)。

缓存和检索参数通过使⽤ CacheParameterSet ⽅法,可以缓存 SqlParameter 对象数组。此⽅法通过将连接字符串和命令⽂本连接起来创建⼀个键,然后将参数数组存储在 Hashtable 中。要从缓存中检索参数,请使⽤ GetCachedParameterSet ⽅法。此⽅法将返回⼀个 SqlParameter 对象数组,这些对象已使⽤缓存(与传递给该⽅法的连接字符串和命令⽂本相对应)中的参数的名称、值、⽅向和数据类型等进⾏了初始化。注意: ⽤作参数集的键的连接字符串通过简单的字符串⽐较进⾏匹配。⽤于从 GetCachedParameterSet 中检索参数的连接字符串必须与⽤来通过 CacheParameterSet 来存储这些参数的连接字符串完全相同。语法不同的连接字符串即使语义相同,也不会被认为是匹配的。以下代码显⽰了如何使⽤ SqlHelperParameterCache 类来缓存和检索 Transact-SQL 语句的参数。[Visual Basic]' 初始化连接字符串和命令⽂本' 它们将构成⽤来存储和检索参数的键Const CONN_STRING As String = _"SERVER=(local); DATABASE=Northwind; INTEGRATED SECURITY=True;"Dim sql As String = _"SELECT ProductName FROM Products " + _"WHERE Category=@Cat AND SupplierID = @Sup"' 缓存参数Dim paramsToStore(1) As SqlParameterparamsToStore(0) = New SqlParameter("@Cat", )paramsToStore(1) = New SqlParameter("@Sup", )arameterSet(CONN_STRING, _sql, _paramsToStore)' 从缓存中检索参数Dim storedParams(1) As SqlParameterstoredParams = hedParameterSet( _CONN_STRING, sql)storedParams(0).Value = 2storedParams(1).Value = 3' 在命令中使⽤参数Dim ds As DataSetds = eDataset(CONN_STRING, _, _sql, storedParams)[C#]// 初始化连接字符串和命令⽂本// 它们将构成⽤来存储和检索参数的键const string CONN_STRING ="SERVER=(local); DATABASE=Northwind; INTEGRATED SECURITY=True;";string spName = "SELECT ProductName FROM Products " +

"WHERE Category=@Cat AND SupplierID = @Sup";// 缓存参数SqlParameter[] paramsToStore = new SqlParameter[2];paramsToStore[0] = New SqlParameter("@Cat", );paramsToStore[1] = New SqlParameter("@Sup", );arameterSet(CONN_STRING,

sql,

paramsToStore);// 从缓存中检索参数SqlParameter storedParams = new SqlParameter[2];storedParams = hedParameterSet(CONN_STRING, sql);storedParams(0).Value = 2;storedParams(1).Value = 3;// 在命令中使⽤参数DataSet ds;ds = eDataset(CONN_STRING,

Procedure,sql, storedParams);检索存储过程参数SqlHelperParameterCache 还提供了针对特定存储过程检索参数数组的⽅法。⼀种名为 GetSpParameterSet 的重载⽅法提供了此功能,它包含两种实现。该⽅法尝试从缓存中检索特定存储过程的参数。如果这些参数尚未被缓存,则使⽤ .NET 的 SqlCommandBuilder 类从内部检索,并将它们添加到缓存中,以便⽤于后续的检索请求。然后,为每个参数指定相应的参数设置,最后将这些参数以数组形式返回给客户端。以下代码显⽰了如何检索 Northwind 数据库中 SalesByCategory 存储过程的参数。[Visual Basic]' 初始化连接字符串和命令⽂本' 它们将构成⽤来存储和检索参数的键Const CONN_STRING As String = _"SERVER=(local); DATABASE=Northwind; INTEGRATED SECURITY=True;"Dim spName As String = "SalesByCategory"' 检索参数Dim storedParams(1) As SqlParameterstoredParams = arameterSet( _CONN_STRING, spName)storedParams(0).Value = "Beverages"storedParams(1).Value = "1997"' 在命令中使⽤参数Dim ds As DataSetds = eDataset(CONN_STRING, _Procedure, _spName, storedParams)[C#]// 初始化连接字符串和命令⽂本// 它们将构成⽤来存储和检索参数的键const string CONN_STRING =

"SERVER=(local); DATABASE=Northwind; INTEGRATED SECURITY=True;";string spName = "SalesByCategory";// 检索参数SqlParameter storedParams = new SqlParameter[2];storedParams = arameterSet(CONN_STRING, spName);storedParams[0].Value = "Beverages";storedParams[1].Value = "1997";// 在命令中使⽤参数DataSet ds;ds = eDataset(CONN_STRING,

Procedure,spName, storedParams);内部设计Data Access Application Block 包含了完整的源代码和有关其设计的综合指南。本节介绍有关主要实现的详细信息。SqlHelper 类实现详细信息SqlHelper 类⽤于通过⼀组静态⽅法来封装数据访问功能。该类不能被继承或实例化,因此将其声明为包含专⽤构造函数的不可继承类。在 SqlHelper 类中实现的每种⽅法都提供了⼀组⼀致的重载。这提供了⼀种很好的使⽤ SqlHelper 类来执⾏命令的模式,同时为开发⼈员选择访问数据的⽅式提供了必要的灵活性。每种⽅法的重载都⽀持不同的⽅法参数,因此开发⼈员可以确定传递连接、事务和参数信息的⽅式。在 SqlHelper 类中实现的⽅法包括:

ExecuteNonQuery。此⽅法⽤于执⾏不返回任何⾏或值的命令。这些命令通常⽤于执⾏数据库更新,但也可⽤于返回存储过程的输出参数。ExecuteReader。此⽅法⽤于返回 SqlDataReader 对象,该对象包含由某⼀命令返回的结果集。

ExecuteDataset。此⽅法返回 DataSet 对象,该对象包含由某⼀命令返回的结果集。

ExecuteScalar。此⽅法返回⼀个值。该值始终是该命令返回的第⼀⾏的第⼀列。

ExecuteXmlReader。此⽅法返回 FOR XML 查询的 XML ⽚段。

除了这些公共⽅法外,SqlHelper 类还包含⼀些专⽤函数,⽤于管理参数和准备要执⾏的命令。不管客户端调⽤什么样的⽅法实现,所有命令都通过 SqlCommand 对象来执⾏。在 SqlCommand 对象能够被执⾏之前,所有参数都必须添加到 Parameters 集合中,并且必须正确设置 Connection、CommandType、CommandText 和 Transaction 属性。SqlHelper 类中的专⽤函数主要⽤于提供⼀种⼀致的⽅式,以便向SQL Server 数据库发出命令,⽽不考虑客户端应⽤程序调⽤的重载⽅法实现。SqlHelper 类中的专⽤实⽤程序函数包括:

AttachParameters:该函数⽤于将所有必要的 SqlParameter 对象连接到正在运⾏的 SqlCommand。

AssignParameterValues:该函数⽤于为 SqlParameter 对象赋值。

PrepareCommand:该函数⽤于对命令的属性(如连接、事务环境等)进⾏初始化。

ExecuteReader:此专⽤ ExecuteReader 实现⽤于通过适当的 CommandBehavior 打开 SqlDataReader 对象,以便最有效地管理与阅读器关联的连接的有效期。

SqlHelperParameterCache 类实现详细信息参数数组缓存在专⽤ Hashtable 中。从缓存中检索的参数进⾏内部复制,这样客户端应⽤程序能够更改参数值以及进⾏其他操作,⽽不会影响缓存的参数数组。专⽤共享函数 CloneParameters 可以实现此⽬的。常见问题此版本包含哪些新增功能?与 Data Access Application Block Beta 2.0 版本相⽐,该 RTM 版本包含以下新增功能和变化:

SqlHelper 类⽅法的事务型重载不再需要 SqlConnection 参数。在此版本中,连接信息从 SqlTransaction 对象中派⽣,因此不必在⽅法签名中包含 SqlConnection 对象参数。

现在,GetSpParameterSet ⽅法使⽤ CommandBuilder 类的 DeriveParameters ⽅法来确定存储过程所需要的参数。这⽐ Beta2.0 版本中直接通过查询数据库来检索信息的效率更⾼。

可以使⽤ XCOPY 部署⽅法来部署 Data Access Application Block 程序集吗?可以。 程序集在编译后可以使⽤ XCOPY 进⾏部署。什么时候应该使⽤ ExecuteDataset ⽅法,什么时候应该使⽤ ExecuteReader ⽅法?这个问题实际上是什么时候应该返回 DataSet 对象中的多个数据⾏,什么时候应该使⽤ DataReader。答案取决于您的应⽤程序的特定需要,以及您在灵活性和原始性能之间的取舍。DataSet 为您提供数据的灵活的且断开连接的关系视图,⽽ DataReader 为您提供性能卓越的、只读的、仅向前光标。有关 DataSet 和 DataReader 的全⾯⽐较,请参阅 Data Access Architecture Guide(英⽂)。如何使⽤ ExecuteDataset 返回包含多个表的数据集?通过创建⼀个可以返回多个⾏集的存储过程(通过执⾏多个 SELECT 语句或者对其他存储过程进⾏嵌套调⽤),并使⽤ ExecuteDataset ⽅法执⾏该过程,您可以检索包含多个表的数据集。例如,假设您的数据库包含以下存储过程。CREATE PROCEDURE GetCategoriesASSELECT * FROM CategoriesGOCREATE PROCEDURE GetProductsASSELECT * FROM Products您可以创建⼀个主存储过程来对这些过程进⾏嵌套调⽤,如下⾯的代码⽰例所⽰。CREATE PROCEDURE GetCategoriesAndProductsASBEGINEXEC GetCategoriesEXEC GetProductsEND使⽤ ExecuteDataset ⽅法执⾏此主存储过程将返回⼀个 DateSet,其中包含两个表:⼀个表包含分类数据,另⼀个表包含产品数据。注意: ExecuteDataset ⽅法不提供为返回的表指定⾃定义名称的⽅法。第⼀个表的编号始终为 0,名称为 Table,第⼆个表的编号为 1,名称为 Table1,依此类推。

2023年6月21日发(作者:)

SqlHelp使⽤指南(转)摘要:Data Access Application Block 是⼀个 .NET 组件,包含优化的数据访问代码,可以帮助⽤户调⽤存储过程以及向 SQL Server 数据库发出 SQL ⽂本命令。它返回 SqlDataReader、DataSet 和 XmlReader 对象。您可以在⾃⼰的 .NET 应⽤程序中将其作为构造块来使⽤,以减少需要创建、测试和维护的⾃定义代码的数量。您可以下载完整的 C# 和 Visual Basic .NET 源代码以及综合⽂档。

简介您是否正在从事 .NET 应⽤程序数据访问代码的设计和开发?您是否觉得⾃⼰总是在反复编写相同的数据访问代码?您是否曾经将数据访问代码包装在 Helper 函数中,以便能够在⼀⾏中调⽤存储过程?如果是,那么 Microsoft® Data Access Application Block for .NET 正是为您设计的。Data Access Application Block 将访问 Microsoft SQL Server™ 数据库的性能和资源管理⽅⾯的最佳经验封装在⼀起。您可以很⽅便地在⾃⼰的 .NET 应⽤程序中将其作为构造块使⽤,从页减少了需要创建、测试和维护的⾃定义代码的数量。尤其是,Data Access Application Block 可以帮助您:

调⽤存储过程或 SQL ⽂本命令。

指定参数详细信息。

返回 SqlDataReader、DataSet 或 XmlReader 对象。

例如,在引⽤了 Data Access Application Block 的应⽤程序中,您可以简单地在⼀⾏代码中调⽤存储过程并⽣成 DataSet,如下所⽰:[Visual Basic]Dim ds As DataSet = eDataset( _connectionString, _Procedure, _"getProductsByCategory", _new SqlParameter("@CategoryID", categoryID))[C#]DataSet ds = eDataset(

connectionString,Procedure,"getProductsByCategory",new SqlParameter("@CategoryID", categoryID));

注意: Application Block for .NET(⽤于 .NET 的应⽤程序块)是基于对成功的 .NET 应⽤程序进⾏详细研究⽽设计的。它以源代码的形式提供,您可以原样使⽤,也可以针对⾃⼰的应⽤程序进⾏⾃定义。该应⽤程序块并不代表未来 Microsoft 程序库的发展⽅向。Microsoft 程序库是为在各种使⽤情况下实现对数据访问⾏为的精确控制⽽建⽴的。将来的 版本可能会使⽤不同的模型来实现这个⽅案SqlHelper 类提供了⼀组静态⽅法,可以⽤来向 SQL Server 数据库发出许多各种不同类型的命令。SqlHelperParameterCache 类提供命令参数缓存功能,可以⽤来提⾼性能。该类由许多 Execute ⽅法(尤其是那些只运⾏存储过程的重写⽅法)在内部使⽤。数据访问客户端也可以直接使⽤它来缓存特定命令的特定参数集。使⽤ SqlHelper 类执⾏命令SqlHelper 类提供了五种 Shared (Visual Basic) 或 static (C#) ⽅法,它们是:ExecuteNonQuery、ExecuteDataset、ExecuteReader、ExecuteScalar 和 ExecuteXmlReader。实现的每种⽅法都提供⼀组⼀致的重载。这提供了⼀种很好的使⽤ SqlHelper 类来执⾏命令的模式,同时为开发⼈员选择访问数据的⽅式提供了必要的灵活性。每种⽅法的重载都⽀持不同的⽅法参数,因此开发⼈员可以确定传递连接、事务和参数信息的⽅式。类中实现的所有⽅法都⽀持以下重载:[Visual Basic]Execute* (ByVal connection As SqlConnection, _ByVal commandType As CommandType, _ByVal CommandText As String)Execute* (ByVal connection As SqlConnection, _ByVal commandType As CommandType, _ByVal commandText As String, _ByVal ParamArray commandParameters() As SqlParameter)Execute* (ByVal connection As SqlConnection, _ByVal spName As String, _ByVal ParamArray parameterValues() As Object)Execute* (ByVal transaction As SqlTransaction, _ByVal commandType As CommandType, _ByVal commandText As String)Execute* (ByVal transaction As SqlTransaction, _ByVal commandType As CommandType, _ByVal commandText As String, _ByVal ParamArray commandParameters() As SqlParameter)Execute* (ByVal transaction As SqlTransaction, _ByVal spName As String, _ByVal ParamArray parameterValues() As Object)[C#]Execute* (SqlConnection connection, CommandType commandType,

string commandText)Execute* (SqlConnection connection, CommandType commandType,string commandText, params SqlParameter[] commandParameters)Execute* (SqlConnection connection, string spName,

params object[] parameterValues)Execute* (SqlConnection connection,

CommandType commandType, string commandText)Execute* (SqlConnection connection,CommandType commandType, string commandText,

params SqlParameter[] commandParameters)Execute* (SqlConnection connection,string spName, params object[] parameterValues)除这些重载以外,除 ExecuteXmlReader 之外的其他⽅法还提供了另⼀种重载:允许将连接信息作为连接字符串⽽不是连接对象来传递,如下⾯的⽅法签名所⽰:[Visual Basic]Execute* (ByVal connectionString As String, _ByVal commandType As CommandType, _ByVal commandText As String)Execute* (ByVal connectionString As String, _ByVal commandType As CommandType, _ByVal commandText As String, _ByVal ParamArray commandParameters() As SqlParameter)Execute* (ByVal connectionString As String, _ByVal spName As String, _ByVal ParamArray parameterValues() As Object)[C#]Execute* (string connectionString, CommandType commandType,

string commandText)Execute* (string connectionString, CommandType commandType,

string commandText,

params SqlParameter[] commandParameters)Execute* (string connectionString, string spName,

params object[] parameterValues)注意: ExecuteXmlReader 不⽀持连接字符串,因为:与 SqlDataReader 对象不同,XmlReader 对象在 XmlReader 关闭时没有提供⾃动关闭连接的⽅法。如果客户端传递了连接字符串,那么当客户端完成对 XmlReader 的操作后,将⽆法关闭与 XmlReader 相关联的连接对象。通过参考 Data Access Application Block 程序集并导⼊ 命名空间,您可以轻松编写使⽤任何⼀种SqlHelper 类⽅法的代码,如下⾯的代码⽰例所⽰:[Visual Basic]Imports [C#]using ;导⼊命名空间后,您可以调⽤任何 Execute* ⽅法,如下⾯的代码⽰例所⽰:[Visual Basic]Dim ds As DataSet = eDataset( _"SERVER=(local);DATABASE=Northwind;INTEGRATED SECURITY=True;",_, "SELECT * FROM Products")[C#]DataSet ds = eDataset(

"SERVER=DataServer;DATABASE=Northwind;INTEGRATEDSECURITY=sspi;", _, "SELECT * FROM Products");使⽤ SqlHelperParameterCache 类管理参数SqlHelperParameterCache 类提供了三种可以⽤来管理参数的公共共享⽅法。它们是:

CacheParameterSet。⽤于将 SqlParameters 数组存储到缓存中。

GetCachedParameterSet。⽤于检索缓存的参数数组的副本。

GetSpParameterSet。⼀种重载⽅法,⽤于检索指定存储过程的相应参数(⾸先查询⼀次数据库,然后缓存结果以便将来查询)。

缓存和检索参数通过使⽤ CacheParameterSet ⽅法,可以缓存 SqlParameter 对象数组。此⽅法通过将连接字符串和命令⽂本连接起来创建⼀个键,然后将参数数组存储在 Hashtable 中。要从缓存中检索参数,请使⽤ GetCachedParameterSet ⽅法。此⽅法将返回⼀个 SqlParameter 对象数组,这些对象已使⽤缓存(与传递给该⽅法的连接字符串和命令⽂本相对应)中的参数的名称、值、⽅向和数据类型等进⾏了初始化。注意: ⽤作参数集的键的连接字符串通过简单的字符串⽐较进⾏匹配。⽤于从 GetCachedParameterSet 中检索参数的连接字符串必须与⽤来通过 CacheParameterSet 来存储这些参数的连接字符串完全相同。语法不同的连接字符串即使语义相同,也不会被认为是匹配的。以下代码显⽰了如何使⽤ SqlHelperParameterCache 类来缓存和检索 Transact-SQL 语句的参数。[Visual Basic]' 初始化连接字符串和命令⽂本' 它们将构成⽤来存储和检索参数的键Const CONN_STRING As String = _"SERVER=(local); DATABASE=Northwind; INTEGRATED SECURITY=True;"Dim sql As String = _"SELECT ProductName FROM Products " + _"WHERE Category=@Cat AND SupplierID = @Sup"' 缓存参数Dim paramsToStore(1) As SqlParameterparamsToStore(0) = New SqlParameter("@Cat", )paramsToStore(1) = New SqlParameter("@Sup", )arameterSet(CONN_STRING, _sql, _paramsToStore)' 从缓存中检索参数Dim storedParams(1) As SqlParameterstoredParams = hedParameterSet( _CONN_STRING, sql)storedParams(0).Value = 2storedParams(1).Value = 3' 在命令中使⽤参数Dim ds As DataSetds = eDataset(CONN_STRING, _, _sql, storedParams)[C#]// 初始化连接字符串和命令⽂本// 它们将构成⽤来存储和检索参数的键const string CONN_STRING ="SERVER=(local); DATABASE=Northwind; INTEGRATED SECURITY=True;";string spName = "SELECT ProductName FROM Products " +

"WHERE Category=@Cat AND SupplierID = @Sup";// 缓存参数SqlParameter[] paramsToStore = new SqlParameter[2];paramsToStore[0] = New SqlParameter("@Cat", );paramsToStore[1] = New SqlParameter("@Sup", );arameterSet(CONN_STRING,

sql,

paramsToStore);// 从缓存中检索参数SqlParameter storedParams = new SqlParameter[2];storedParams = hedParameterSet(CONN_STRING, sql);storedParams(0).Value = 2;storedParams(1).Value = 3;// 在命令中使⽤参数DataSet ds;ds = eDataset(CONN_STRING,

Procedure,sql, storedParams);检索存储过程参数SqlHelperParameterCache 还提供了针对特定存储过程检索参数数组的⽅法。⼀种名为 GetSpParameterSet 的重载⽅法提供了此功能,它包含两种实现。该⽅法尝试从缓存中检索特定存储过程的参数。如果这些参数尚未被缓存,则使⽤ .NET 的 SqlCommandBuilder 类从内部检索,并将它们添加到缓存中,以便⽤于后续的检索请求。然后,为每个参数指定相应的参数设置,最后将这些参数以数组形式返回给客户端。以下代码显⽰了如何检索 Northwind 数据库中 SalesByCategory 存储过程的参数。[Visual Basic]' 初始化连接字符串和命令⽂本' 它们将构成⽤来存储和检索参数的键Const CONN_STRING As String = _"SERVER=(local); DATABASE=Northwind; INTEGRATED SECURITY=True;"Dim spName As String = "SalesByCategory"' 检索参数Dim storedParams(1) As SqlParameterstoredParams = arameterSet( _CONN_STRING, spName)storedParams(0).Value = "Beverages"storedParams(1).Value = "1997"' 在命令中使⽤参数Dim ds As DataSetds = eDataset(CONN_STRING, _Procedure, _spName, storedParams)[C#]// 初始化连接字符串和命令⽂本// 它们将构成⽤来存储和检索参数的键const string CONN_STRING =

"SERVER=(local); DATABASE=Northwind; INTEGRATED SECURITY=True;";string spName = "SalesByCategory";// 检索参数SqlParameter storedParams = new SqlParameter[2];storedParams = arameterSet(CONN_STRING, spName);storedParams[0].Value = "Beverages";storedParams[1].Value = "1997";// 在命令中使⽤参数DataSet ds;ds = eDataset(CONN_STRING,

Procedure,spName, storedParams);内部设计Data Access Application Block 包含了完整的源代码和有关其设计的综合指南。本节介绍有关主要实现的详细信息。SqlHelper 类实现详细信息SqlHelper 类⽤于通过⼀组静态⽅法来封装数据访问功能。该类不能被继承或实例化,因此将其声明为包含专⽤构造函数的不可继承类。在 SqlHelper 类中实现的每种⽅法都提供了⼀组⼀致的重载。这提供了⼀种很好的使⽤ SqlHelper 类来执⾏命令的模式,同时为开发⼈员选择访问数据的⽅式提供了必要的灵活性。每种⽅法的重载都⽀持不同的⽅法参数,因此开发⼈员可以确定传递连接、事务和参数信息的⽅式。在 SqlHelper 类中实现的⽅法包括:

ExecuteNonQuery。此⽅法⽤于执⾏不返回任何⾏或值的命令。这些命令通常⽤于执⾏数据库更新,但也可⽤于返回存储过程的输出参数。ExecuteReader。此⽅法⽤于返回 SqlDataReader 对象,该对象包含由某⼀命令返回的结果集。

ExecuteDataset。此⽅法返回 DataSet 对象,该对象包含由某⼀命令返回的结果集。

ExecuteScalar。此⽅法返回⼀个值。该值始终是该命令返回的第⼀⾏的第⼀列。

ExecuteXmlReader。此⽅法返回 FOR XML 查询的 XML ⽚段。

除了这些公共⽅法外,SqlHelper 类还包含⼀些专⽤函数,⽤于管理参数和准备要执⾏的命令。不管客户端调⽤什么样的⽅法实现,所有命令都通过 SqlCommand 对象来执⾏。在 SqlCommand 对象能够被执⾏之前,所有参数都必须添加到 Parameters 集合中,并且必须正确设置 Connection、CommandType、CommandText 和 Transaction 属性。SqlHelper 类中的专⽤函数主要⽤于提供⼀种⼀致的⽅式,以便向SQL Server 数据库发出命令,⽽不考虑客户端应⽤程序调⽤的重载⽅法实现。SqlHelper 类中的专⽤实⽤程序函数包括:

AttachParameters:该函数⽤于将所有必要的 SqlParameter 对象连接到正在运⾏的 SqlCommand。

AssignParameterValues:该函数⽤于为 SqlParameter 对象赋值。

PrepareCommand:该函数⽤于对命令的属性(如连接、事务环境等)进⾏初始化。

ExecuteReader:此专⽤ ExecuteReader 实现⽤于通过适当的 CommandBehavior 打开 SqlDataReader 对象,以便最有效地管理与阅读器关联的连接的有效期。

SqlHelperParameterCache 类实现详细信息参数数组缓存在专⽤ Hashtable 中。从缓存中检索的参数进⾏内部复制,这样客户端应⽤程序能够更改参数值以及进⾏其他操作,⽽不会影响缓存的参数数组。专⽤共享函数 CloneParameters 可以实现此⽬的。常见问题此版本包含哪些新增功能?与 Data Access Application Block Beta 2.0 版本相⽐,该 RTM 版本包含以下新增功能和变化:

SqlHelper 类⽅法的事务型重载不再需要 SqlConnection 参数。在此版本中,连接信息从 SqlTransaction 对象中派⽣,因此不必在⽅法签名中包含 SqlConnection 对象参数。

现在,GetSpParameterSet ⽅法使⽤ CommandBuilder 类的 DeriveParameters ⽅法来确定存储过程所需要的参数。这⽐ Beta2.0 版本中直接通过查询数据库来检索信息的效率更⾼。

可以使⽤ XCOPY 部署⽅法来部署 Data Access Application Block 程序集吗?可以。 程序集在编译后可以使⽤ XCOPY 进⾏部署。什么时候应该使⽤ ExecuteDataset ⽅法,什么时候应该使⽤ ExecuteReader ⽅法?这个问题实际上是什么时候应该返回 DataSet 对象中的多个数据⾏,什么时候应该使⽤ DataReader。答案取决于您的应⽤程序的特定需要,以及您在灵活性和原始性能之间的取舍。DataSet 为您提供数据的灵活的且断开连接的关系视图,⽽ DataReader 为您提供性能卓越的、只读的、仅向前光标。有关 DataSet 和 DataReader 的全⾯⽐较,请参阅 Data Access Architecture Guide(英⽂)。如何使⽤ ExecuteDataset 返回包含多个表的数据集?通过创建⼀个可以返回多个⾏集的存储过程(通过执⾏多个 SELECT 语句或者对其他存储过程进⾏嵌套调⽤),并使⽤ ExecuteDataset ⽅法执⾏该过程,您可以检索包含多个表的数据集。例如,假设您的数据库包含以下存储过程。CREATE PROCEDURE GetCategoriesASSELECT * FROM CategoriesGOCREATE PROCEDURE GetProductsASSELECT * FROM Products您可以创建⼀个主存储过程来对这些过程进⾏嵌套调⽤,如下⾯的代码⽰例所⽰。CREATE PROCEDURE GetCategoriesAndProductsASBEGINEXEC GetCategoriesEXEC GetProductsEND使⽤ ExecuteDataset ⽅法执⾏此主存储过程将返回⼀个 DateSet,其中包含两个表:⼀个表包含分类数据,另⼀个表包含产品数据。注意: ExecuteDataset ⽅法不提供为返回的表指定⾃定义名称的⽅法。第⼀个表的编号始终为 0,名称为 Table,第⼆个表的编号为 1,名称为 Table1,依此类推。