Microsoft Application Blocks for .NET
2008-07-07 16:28
423 查看
MicrosoftApplicationBlocksfor.NET
DataAccessApplicationBlock概述
ChrisBrooks、GraemeMalcolm、AlexMackman、EdwardJezierskiMicrosoftCorporation
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));
本概述的其余部分包括以下内容:
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
VisualStudio®.NET的RTM版本(推荐,但不必需)
SQLServer7.0或更高版本的数据库服务器
下载并安装DataAccessApplicationBlock
您可以获取一个包含已签名的DataAccessApplicationBlock程序集和综合文档的Windows安装程序文件。安装进程将在您的“程序”菜单中创建一个MicrosoftApplicationBlocksfor.NET(用于.NET的Microsoft应用程序块)子菜单。该子菜单中有一个DataAccess(数据访问)子菜单,其中包括用于启动文档的选项和用于启动DataAccessApplicationBlockVisualStudio.NET解决方案的选项。
请转到
使用DataAccessApplicationBlock
本节讨论如何使用DataAccessApplicationBlock来执行数据库命令和管理参数。图1显示了DataAccessApplicationBlock的主要元素。图1:DataAccessApplicationBlock
SqlHelper类提供了一组静态方法,可以用来向SQLServer数据库发出许多各种不同类型的命令。
SqlHelperParameterCache类提供命令参数缓存功能,可以用来提高性能。该类由许多Execute方法(尤其是那些只运行存储过程的重写方法)在内部使用。数据访问客户端也可以直接使用它来缓存特定命令的特定参数集。
使用SqlHelper类执行命令
SqlHelper类提供了五种Shared(VisualBasic)或static(C#)方法,它们是:ExecuteNonQuery、ExecuteDataset、ExecuteReader、ExecuteScalar和ExecuteXmlReader。实现的每种方法都提供一组一致的重载。这提供了一种很好的使用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)
通过参考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对象数组,这些对象已使用缓存(与传递给该方法的连接字符串和命令文本相对应)中的参数的名称、值、方向和数据类型等进行了初始化。
以下代码显示了如何使用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集合中,并且必须正确设置Connection、CommandType、CommandText和Transaction属性。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的全面比较,请参阅如何使用ExecuteDataset返回包含多个表的数据集?
通过创建一个可以返回多个行集的存储过程(通过执行多个SELECT语句或者对其他存储过程进行嵌套调用),并使用ExecuteDataset方法执行该过程,您可以检索包含多个表的数据集。例如,假设您的数据库包含以下存储过程。
CREATEPROCEDUREGetCategories
AS
SELECT*FROMCategories
GO
CREATEPROCEDUREGetProducts
AS
SELECT*FROMProducts
您可以创建一个主存储过程来对这些过程进行嵌套调用,如下面的代码示例所示。
CREATEPROCEDUREGetCategoriesAndProducts
AS
BEGIN
EXECGetCategories
EXECGetProducts
END
使用ExecuteDataset方法执行此主存储过程将返回一个DateSet,其中包含两个表:一个表包含分类数据,另一个表包含产品数据。
还有其他的应用程序块吗?
DataAccessApplicationBlock是即将发布的几个应用程序块之一。这些应用程序块可以解决开发人员在不同项目中遇到的共同问题。它们可以快速方便地插入到.NET应用程序中。反馈和支持
如果您对DataAccessApplicationBlock有任何问题、意见和建议,请向ApplicationBlocksfor.NET旨在协助开发.NET分布式应用程序。示例代码和文档都按原样提供。尽管已经过测试并被认为是稳定的代码集,但我们并不象传统的Microsoft产品那样对其提供支持。
我们还创建了一个新闻组,可以帮助您使用ApplicationBlocksfor.NET(.NET应用程序块)。您可以通过新闻组在联机的开放论坛中向同行、同事和Microsoft支持专家咨询。
其他人也可以从您的问题和评论中获益,我们的开发小组将每天查看新闻组:
新闻组:基于Web的读者
新闻组:NNTP读者
您想学习和利用.NET的功能吗?欢迎您与MicrosoftTechnologyCenters的技术专家并肩工作,您将学到最好的开发经验。有关详细信息,请访问
您需要更多的帮助吗?请访问新增的客户支持服务AdvisoryServices,该解决方案可以满足您小规模的咨询需要。有关AdvisoryServices的详细信息,请访问
更多信息
DataAccessApplicationBlock的设计和开发是建立在合作者
衷心感谢以下投稿人和审阅人:SusanWarren、BradAbrams、AndyDunn、MichaelDay、MarkAshton、GregoryLeake、SteveBusby、KennyJones、DavidSchleifer、AndrewRoubin(VorsiteCorp.)、JeffreyRichter(Wintellect)、BernardChen(Sapient)和MattDrucker(TurnerBroadcasting)。同时感谢内容组的以下成员:TinaBurden(Entirenet)、ShylenderRamamurthy(InfosysTechnologiesLtd)和FilibertoSelvasPatino。