您的位置:首页 > 移动开发

SqlHelper使用的命名空间Data Access Application Block介绍

2006-07-28 11:42 253 查看

MicrosoftApplicationBlocksfor.NET

DataAccessApplicationBlock概述

ChrisBrooks、GraemeMalcolm、AlexMackman、EdwardJezierski
MicrosoftCorporation

2002年4月

摘要:DataAccessApplicationBlock是一个.NET组件,包含优化的数据访问代码,可以帮助用户调用存储过程以及向SQLServer数据库发出SQL文本命令。它返回SqlDataReader、DataSet和XmlReader对象。您可以在自己的.NET应用程序中将其作为构造块来使用,以减少需要创建、测试和维护的自定义代码的数量。您可以下载完整的C#和VisualBasic.NET源代码以及综合文档。

简介

您是否正在从事.NET应用程序数据访问代码的设计和开发?您是否觉得自己总是在反复编写相同的数据访问代码?您是否曾经将数据访问代码包装在Helper函数中,以便能够在一行中调用存储过程?如果是,那么Microsoft®DataAccessApplicationBlockfor.NET正是为您设计的。

DataAccessApplicationBlock将访问MicrosoftSQLServer™数据库的性能和资源管理方面的最佳经验封装在一起。您可以很方便地在自己的.NET应用程序中将其作为构造块使用,从页减少了需要创建、测试和维护的自定义代码的数量。

尤其是,DataAccessApplicationBlock可以帮助您:

调用存储过程或SQL文本命令。
指定参数详细信息。
返回SqlDataReader、DataSet或XmlReader对象。

例如,在引用了DataAccessApplicationBlock的应用程序中,您可以简单地在一行代码中调用存储过程并生成DataSet,如下所示:

[VisualBasic]
DimdsAsDataSet=SqlHelper.ExecuteDataset(_
connectionString,_
CommandType.StoredProcedure,_
"getProductsByCategory",_
newSqlParameter("@CategoryID",categoryID))
[C#]
DataSetds=SqlHelper.ExecuteDataset(
connectionString,
CommandType.StoredProcedure,
"getProductsByCategory",
newSqlParameter("@CategoryID",categoryID));

注意:[/b]
ApplicationBlockfor.NET(用于.NET的应用程序块)是基于对成功的.NET应用程序进行详细研究而设计的。它以源代码的形式提供,您可以原样使用,也可以针对自己的应用程序进行自定义。该应用程序块并不代表未来MicrosoftADO.NET程序库的发展方向。MicrosoftADO.NET程序库是为在各种使用情况下实现对数据访问行为的精确控制而建立的。将来的ADO.NET版本可能会使用不同的模型来实现这个方案。

本概述的其余部分包括以下内容:

DataAccessApplicationBlock包括哪些内容?

下载和安装DataAccessApplicationBlock

使用DataAccessApplicationBlock

内部设计

常见问题

反馈和支持

合作者

DataAccessApplicationBlock包括哪些内容?

提供了DataAccessApplicationBlock的源代码以及快速入门示例应用程序,您可以使用这些应用程序测试其功能。DataAccessApplicationBlock还包括综合文档,可以帮助您使用和了解所提供的代码。

VisualStudio.NET项目

提供了DataAccessApplicationBlock的MicrosoftVisualBasic®.NET和MicrosoftVisualC#™源代码,以及每种语言的快速入门示例客户端应用程序,您可以使用这些应用程序测试常见的方案。这有助于加深您对DataAccessApplicationBlock的工作原理的了解。您还可以自定义源代码以满足自己的需要。

您可以编译VisualBasic和C#Microsoft.ApplicationBlocks.Data项目,以生成一个名为Microsoft.ApplicationBlocks.Data.dll的程序集。该程序集包括一个SqlHelper类(其中包含用于执行数据库命令的核心功能)和一个SqlhelperParameterCache类(提供参数发现和缓存功能)。

文档

DataAccessApplicationBlock的文档主要包括以下内容:

使用DataAccessApplicationBlock开发应用程序。本部分包括快速入门示例,其中包含多种常见的使用情况,可以帮助您快速轻松地掌握DataAccessApplicationBlock(数据访问应用程序块)的使用。
DataAccessApplicationBlock的设计与实现。本部分包括背景设计原理信息,以便用户深入了解DataAccessApplicationBlock的设计与实现。
部署和运行。本部分包括安装信息,其中包含部署和更新选项以及与安全性有关的信息。
参考。本部分包含综合的API参考,其中详细介绍了构成DataAccessApplicationBlock的类和接口。

系统要求

要运行DataAccessApplicationBlock,需要满足以下要求:

MicrosoftWindows®2000、WindowsXPProfessional
.NETFrameworkSDK(英文)的RTM版本
VisualStudio®.NET的RTM版本(推荐,但不必需)
SQLServer7.0或更高版本的数据库服务器

下载并安装DataAccessApplicationBlock

您可以获取一个包含已签名的DataAccessApplicationBlock程序集和综合文档的Windows安装程序文件。

安装进程将在您的“程序”菜单中创建一个MicrosoftApplicationBlocksfor.NET(用于.NET的Microsoft应用程序块)子菜单。该子菜单中有一个DataAccess(数据访问)子菜单,其中包括用于启动文档的选项和用于启动DataAccessApplicationBlockVisualStudio.NET解决方案的选项。

请转到MSDNDownloads(英文)进行下载。

使用DataAccessApplicationBlock

本节讨论如何使用DataAccessApplicationBlock来执行数据库命令和管理参数。图1显示了DataAccessApplicationBlock的主要元素。





图1:DataAccessApplicationBlock

SqlHelper类提供了一组静态方法,可以用来向SQLServer数据库发出许多各种不同类型的命令。

SqlHelperParameterCache类提供命令参数缓存功能,可以用来提高性能。该类由许多Execute方法(尤其是那些只运行存储过程的重写方法)在内部使用。数据访问客户端也可以直接使用它来缓存特定命令的特定参数集。

使用SqlHelper类执行命令

SqlHelper类提供了五种Shared(VisualBasic)或static(C#)方法,它们是:ExecuteNonQueryExecuteDatasetExecuteReaderExecuteScalarExecuteXmlReader。实现的每种方法都提供一组一致的重载。这提供了一种很好的使用SqlHelper类来执行命令的模式,同时为开发人员选择访问数据的方式提供了必要的灵活性。每种方法的重载都支持不同的方法参数,因此开发人员可以确定传递连接、事务和参数信息的方式。类中实现的所有方法都支持以下重载:

[VisualBasic]
Execute*(ByValconnectionAsSqlConnection,_
ByValcommandTypeAsCommandType,_
ByValCommandTextAsString)
Execute*(ByValconnectionAsSqlConnection,_
ByValcommandTypeAsCommandType,_
ByValcommandTextAsString,_
ByValParamArraycommandParameters()AsSqlParameter)
Execute*(ByValconnectionAsSqlConnection,_
ByValspNameAsString,_
ByValParamArrayparameterValues()AsObject)
Execute*(ByValtransactionAsSqlTransaction,_
ByValcommandTypeAsCommandType,_
ByValcommandTextAsString)
Execute*(ByValtransactionAsSqlTransaction,_
ByValcommandTypeAsCommandType,_
ByValcommandTextAsString,_
ByValParamArraycommandParameters()AsSqlParameter)
Execute*(ByValtransactionAsSqlTransaction,_
ByValspNameAsString,_
ByValParamArrayparameterValues()AsObject)
[C#]
Execute*(SqlConnectionconnection,CommandTypecommandType,
stringcommandText)
Execute*(SqlConnectionconnection,CommandTypecommandType,
stringcommandText,paramsSqlParameter[]commandParameters)
Execute*(SqlConnectionconnection,stringspName,
paramsobject[]parameterValues)
Execute*(SqlConnectionconnection,
CommandTypecommandType,stringcommandText)
Execute*(SqlConnectionconnection,
CommandTypecommandType,stringcommandText,
paramsSqlParameter[]commandParameters)
Execute*(SqlConnectionconnection,
stringspName,paramsobject[]parameterValues)

除这些重载以外,除ExecuteXmlReader之外的其他方法还提供了另一种重载:允许将连接信息作为连接字符串而不是连接对象来传递,如下面的方法签名所示:

[VisualBasic]
Execute*(ByValconnectionStringAsString,_
ByValcommandTypeAsCommandType,_
ByValcommandTextAsString)
Execute*(ByValconnectionStringAsString,_
ByValcommandTypeAsCommandType,_
ByValcommandTextAsString,_
ByValParamArraycommandParameters()AsSqlParameter)
Execute*(ByValconnectionStringAsString,_
ByValspNameAsString,_
ByValParamArrayparameterValues()AsObject)
[C#]
Execute*(stringconnectionString,CommandTypecommandType,
stringcommandText)
Execute*(stringconnectionString,CommandTypecommandType,
stringcommandText,
paramsSqlParameter[]commandParameters)
Execute*(stringconnectionString,stringspName,
paramsobject[]parameterValues)

注意:
[/b]ExecuteXmlReader不支持连接字符串,因为:与SqlDataReader对象不同,XmlReader对象在XmlReader关闭时没有提供自动关闭连接的方法。如果客户端传递了连接字符串,那么当客户端完成对XmlReader的操作后,将无法关闭与XmlReader相关联的连接对象。

通过参考DataAccessApplicationBlock程序集并导入Microsoft.ApplicationBlocks.Data命名空间,您可以轻松编写使用任何一种SqlHelper类方法的代码,如下面的代码示例所示:

[VisualBasic]
ImportsMicrosoft.ApplicationBlocks.Data
[C#]
usingMicrosoft.ApplicationBlocks.Data;

导入命名空间后,您可以调用任何Execute*方法,如下面的代码示例所示:

[VisualBasic]
DimdsAsDataSet=SqlHelper.ExecuteDataset(_
"SERVER=(local);DATABASE=Northwind;INTEGRATEDSECURITY=True;",
_
CommandType.Text,"SELECT*FROMProducts")
[C#]
DataSetds=SqlHelper.ExecuteDataset(
"SERVER=DataServer;DATABASE=Northwind;INTEGRATED
SECURITY=sspi;",_
CommandType.Text,"SELECT*FROMProducts");

使用SqlHelperParameterCache类管理参数

SqlHelperParameterCache类提供了三种可以用来管理参数的公共共享方法。它们是:

CacheParameterSet。用于将SqlParameters数组存储到缓存中。
GetCachedParameterSet。用于检索缓存的参数数组的副本。
GetSpParameterSet。一种重载方法,用于检索指定存储过程的相应参数(首先查询一次数据库,然后缓存结果以便将来查询)。

缓存和检索参数

通过使用CacheParameterSet方法,可以缓存SqlParameter对象数组。此方法通过将连接字符串和命令文本连接起来创建一个键,然后将参数数组存储在Hashtable中。

要从缓存中检索参数,请使用GetCachedParameterSet方法。此方法将返回一个SqlParameter对象数组,这些对象已使用缓存(与传递给该方法的连接字符串和命令文本相对应)中的参数的名称、值、方向和数据类型等进行了初始化。

注意:[/b]
用作参数集的键的连接字符串通过简单的字符串比较进行匹配。用于从GetCachedParameterSet中检索参数的连接字符串必须与用来通过CacheParameterSet来存储这些参数的连接字符串完全相同。语法不同的连接字符串即使语义相同,也不会被认为是匹配的。

以下代码显示了如何使用SqlHelperParameterCache类来缓存和检索Transact-SQL语句的参数。

[VisualBasic]
'初始化连接字符串和命令文本
'它们将构成用来存储和检索参数的键
ConstCONN_STRINGAsString=_
"SERVER=(local);DATABASE=Northwind;INTEGRATEDSECURITY=True;"
DimsqlAsString=_
"SELECTProductNameFROMProducts"+_
"WHERECategory=@CatANDSupplierID=@Sup"
'缓存参数
DimparamsToStore(1)AsSqlParameter
paramsToStore(0)=NewSqlParameter("@Cat",SqlDbType.Int)
paramsToStore(1)=NewSqlParameter("@Sup",SqlDbType.Int)
SqlHelperParameterCache.CacheParameterSet(CONN_STRING,_
sql,_
paramsToStore)
'从缓存中检索参数
DimstoredParams(1)AsSqlParameter
storedParams=SqlHelperParameterCache.GetCachedParameterSet(_
CONN_STRING,sql)
storedParams(0).Value=2
storedParams(1).Value=3
'在命令中使用参数
DimdsAsDataSet
ds=SqlHelper.ExecuteDataset(CONN_STRING,_
CommandType.Text,_
sql,storedParams)
[C#]
//初始化连接字符串和命令文本
//它们将构成用来存储和检索参数的键
conststringCONN_STRING=
"SERVER=(local);DATABASE=Northwind;INTEGRATEDSECURITY=True;";
stringspName="SELECTProductNameFROMProducts"+
"WHERECategory=@CatANDSupplierID=@Sup";
//缓存参数
SqlParameter[]paramsToStore=newSqlParameter[2];
paramsToStore[0]=NewSqlParameter("@Cat",SqlDbType.Int);
paramsToStore[1]=NewSqlParameter("@Sup",SqlDbType.Int);
SqlHelperParameterCache.CacheParameterSet(CONN_STRING,
sql,
paramsToStore);
//从缓存中检索参数
SqlParameterstoredParams=newSqlParameter[2];
storedParams=SqlHelperParameterCache.GetCachedParameterSet(
CONN_STRING,sql);
storedParams(0).Value=2;
storedParams(1).Value=3;
//在命令中使用参数
DataSetds;
ds=SqlHelper.ExecuteDataset(CONN_STRING,
CommandType.StoredProcedure,
sql,storedParams);

检索存储过程参数

SqlHelperParameterCache还提供了针对特定存储过程检索参数数组的方法。一种名为GetSpParameterSet的重载方法提供了此功能,它包含两种实现。该方法尝试从缓存中检索特定存储过程的参数。如果这些参数尚未被缓存,则使用.NET的SqlCommandBuilder类从内部检索,并将它们添加到缓存中,以便用于后续的检索请求。然后,为每个参数指定相应的参数设置,最后将这些参数以数组形式返回给客户端。以下代码显示了如何检索Northwind数据库中SalesByCategory存储过程的参数。

[VisualBasic]
'初始化连接字符串和命令文本
'它们将构成用来存储和检索参数的键
ConstCONN_STRINGAsString=_
"SERVER=(local);DATABASE=Northwind;INTEGRATEDSECURITY=True;"
DimspNameAsString="SalesByCategory"
'检索参数
DimstoredParams(1)AsSqlParameter
storedParams=SqlHelperParameterCache.GetSpParameterSet(_
CONN_STRING,spName)
storedParams(0).Value="Beverages"
storedParams(1).Value="1997"
'在命令中使用参数
DimdsAsDataSet
ds=SqlHelper.ExecuteDataset(CONN_STRING,_
CommandType.StoredProcedure,_
spName,storedParams)
[C#]
//初始化连接字符串和命令文本
//它们将构成用来存储和检索参数的键
conststringCONN_STRING=
"SERVER=(local);DATABASE=Northwind;INTEGRATEDSECURITY=True;";
stringspName="SalesByCategory";
//检索参数
SqlParameterstoredParams=newSqlParameter[2];
storedParams=SqlHelperParameterCache.GetSpParameterSet(
CONN_STRING,spName);
storedParams[0].Value="Beverages";
storedParams[1].Value="1997";
//在命令中使用参数
DataSetds;
ds=SqlHelper.ExecuteDataset(CONN_STRING,
CommandType.StoredProcedure,
spName,storedParams);

内部设计

DataAccessApplicationBlock包含了完整的源代码和有关其设计的综合指南。本节介绍有关主要实现的详细信息。

SqlHelper类实现详细信息

SqlHelper类用于通过一组静态方法来封装数据访问功能。该类不能被继承或实例化,因此将其声明为包含专用构造函数的不可继承类。

SqlHelper类中实现的每种方法都提供了一组一致的重载。这提供了一种很好的使用SqlHelper类来执行命令的模式,同时为开发人员选择访问数据的方式提供了必要的灵活性。每种方法的重载都支持不同的方法参数,因此开发人员可以确定传递连接、事务和参数信息的方式。在SqlHelper类中实现的方法包括:

ExecuteNonQuery。此方法用于执行不返回任何行或值的命令。这些命令通常用于执行数据库更新,但也可用于返回存储过程的输出参数。
ExecuteReader。此方法用于返回SqlDataReader对象,该对象包含由某一命令返回的结果集。
ExecuteDataset。此方法返回DataSet对象,该对象包含由某一命令返回的结果集。
ExecuteScalar。此方法返回一个值。该值始终是该命令返回的第一行的第一列。
ExecuteXmlReader。此方法返回FORXML查询的XML片段。

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

AttachParameters:该函数用于将所有必要的SqlParameter对象连接到正在运行的SqlCommand。
AssignParameterValues:该函数用于为SqlParameter对象赋值。
PrepareCommand:该函数用于对命令的属性(如连接、事务环境等)进行初始化。
ExecuteReader:此专用ExecuteReader实现用于通过适当的CommandBehavior打开SqlDataReader对象,以便最有效地管理与阅读器关联的连接的有效期。

SqlHelperParameterCache类实现详细信息

参数数组缓存在专用Hashtable中。从缓存中检索的参数进行内部复制,这样客户端应用程序能够更改参数值以及进行其他操作,而不会影响缓存的参数数组。专用共享函数CloneParameters可以实现此目的。

常见问题

此版本包含哪些新增功能?

与DataAccessApplicationBlockBeta2.0版本相比,该RTM版本包含以下新增功能和变化:

SqlHelper类方法的事务型重载不再需要SqlConnection参数。在此版本中,连接信息从SqlTransaction对象中派生,因此不必在方法签名中包含SqlConnection对象参数。
现在,GetSpParameterSet方法使用ADO.NETCommandBuilder类的DeriveParameters方法来确定存储过程所需要的参数。这比Beta2.0版本中直接通过查询数据库来检索信息的效率更高。

可以使用XCOPY部署方法来部署DataAccessApplicationBlock程序集吗?

可以。Microsoft.ApplicationBlocks.Data.dll程序集在编译后可以使用XCOPY进行部署。

什么时候应该使用ExecuteDataset方法,什么时候应该使用ExecuteReader方法?

这个问题实际上是什么时候应该返回DataSet对象中的多个数据行,什么时候应该使用DataReader。答案取决于您的应用程序的特定需要,以及您在灵活性和原始性能之间的取舍。DataSet为您提供数据的灵活的且断开连接的关系视图,而DataReader为您提供性能卓越的、只读的、仅向前光标。有关DataSet和DataReader的全面比较,请参阅DataAccessArchitectureGuide(英文)。

如何使用ExecuteDataset返回包含多个表的数据集?

通过创建一个可以返回多个行集的存储过程(通过执行多个SELECT语句或者对其他存储过程进行嵌套调用),并使用ExecuteDataset方法执行该过程,您可以检索包含多个表的数据集。

例如,假设您的数据库包含以下存储过程。

CREATEPROCEDUREGetCategories
AS
SELECT*FROMCategories
GO
CREATEPROCEDUREGetProducts
AS
SELECT*FROMProducts

您可以创建一个主存储过程来对这些过程进行嵌套调用,如下面的代码示例所示。

CREATEPROCEDUREGetCategoriesAndProducts
AS
BEGIN
EXECGetCategories
EXECGetProducts
END

使用ExecuteDataset方法执行此主存储过程将返回一个DateSet,其中包含两个表:一个表包含分类数据,另一个表包含产品数据。

注意:[/b]
ExecuteDataset方法不提供为返回的表指定自定义名称的方法。第一个表的编号始终为0,名称为Table,第二个表的编号为1,名称为Table1,依此类推。

还有其他的应用程序块吗?

DataAccessApplicationBlock是即将发布的几个应用程序块之一。这些应用程序块可以解决开发人员在不同项目中遇到的共同问题。它们可以快速方便地插入到.NET应用程序中。

反馈和支持

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐
章节导航