Microsoft Application Blocks for .NET
Data Access Application Block 概述
Chris Brooks、Graeme Malcolm、Alex Mackman、Edward Jezierski
Microsoft Corporation
2002 年 4 月
摘要:Data Access Application Block 是一個(gè) .NET 組件,包含優(yōu)化的數(shù)據(jù)訪(fǎng)問(wèn)代碼,可以幫助用戶(hù)調(diào)用存儲(chǔ)過(guò)程以及向 SQL Server 數(shù)據(jù)庫(kù)發(fā)出 SQL 文本命令。它返回 SqlDataReader、DataSet 和 XmlReader 對(duì)象。您可以在自己的 .NET 應(yīng)用程序中將其作為構(gòu)造塊來(lái)使用,以減少需要?jiǎng)?chuàng)建、測(cè)試和維護(hù)的自定義代碼的數(shù)量。您可以下載完整的 C# 和 Visual Basic .NET 源代碼以及綜合文檔。
簡(jiǎn)介
您是否正在從事 .NET 應(yīng)用程序數(shù)據(jù)訪(fǎng)問(wèn)代碼的設(shè)計(jì)和開(kāi)發(fā)?您是否覺(jué)得自己總是在反復(fù)編寫(xiě)相同的數(shù)據(jù)訪(fǎng)問(wèn)代碼?您是否曾經(jīng)將數(shù)據(jù)訪(fǎng)問(wèn)代碼包裝在 Helper 函數(shù)中,以便能夠在一行中調(diào)用存儲(chǔ)過(guò)程?如果是,那么 Microsoft? Data Access Application Block for .NET 正是為您設(shè)計(jì)的。
Data Access Application Block 將訪(fǎng)問(wèn) Microsoft SQL Server? 數(shù)據(jù)庫(kù)的性能和資源管理方面的最佳經(jīng)驗(yàn)封裝在一起。您可以很方便地在自己的 .NET 應(yīng)用程序中將其作為構(gòu)造塊使用,從頁(yè)減少了需要?jiǎng)?chuàng)建、測(cè)試和維護(hù)的自定義代碼的數(shù)量。
尤其是,Data Access Application Block 可以幫助您:
- 調(diào)用存儲(chǔ)過(guò)程或 SQL 文本命令。
- 指定參數(shù)詳細(xì)信息。
- 返回 SqlDataReader、DataSet 或 XmlReader 對(duì)象。
例如,在引用了 Data Access Application Block 的應(yīng)用程序中,您可以簡(jiǎn)單地在一行代碼中調(diào)用存儲(chǔ)過(guò)程并生成 DataSet,如下所示:
[Visual Basic] Dim ds As DataSet = SqlHelper.ExecuteDataset( _ connectionString, _ CommandType.StoredProcedure, _ "getProductsByCategory", _ new SqlParameter("@CategoryID", categoryID)) [C#] DataSet ds = SqlHelper.ExecuteDataset( connectionString, CommandType.StoredProcedure, "getProductsByCategory", new SqlParameter("@CategoryID", categoryID));
注意:
Application Block for .NET(用于 .NET 的應(yīng)用程序塊)是基于對(duì)成功的 .NET 應(yīng)用程序進(jìn)行詳細(xì)研究而設(shè)計(jì)的。它以源代碼的形式提供,您可以原樣使用,也可以針對(duì)自己的應(yīng)用程序進(jìn)行自定義。該應(yīng)用程序塊并不代表未來(lái) Microsoft ADO.NET 程序庫(kù)的發(fā)展方向。Microsoft ADO.NET 程序庫(kù)是為在各種使用情況下實(shí)現(xiàn)對(duì)數(shù)據(jù)訪(fǎng)問(wèn)行為的精確控制而建立的。將來(lái)的 ADO.NET 版本可能會(huì)使用不同的模型來(lái)實(shí)現(xiàn)這個(gè)方案。
本概述的其余部分包括以下內(nèi)容:
Data Access Application Block 包括哪些內(nèi)容?
下載和安裝 Data Access Application Block
使用 Data Access Application Block
Data Access Application Block 包括哪些內(nèi)容?
提供了 Data Access Application Block 的源代碼以及快速入門(mén)示例應(yīng)用程序,您可以使用這些應(yīng)用程序測(cè)試其功能。Data Access Application Block 還包括綜合文檔,可以幫助您使用和了解所提供的代碼。
Visual Studio .NET 項(xiàng)目
提供了 Data Access Application Block 的 Microsoft Visual Basic? .NET 和 Microsoft Visual C#? 源代碼,以及每種語(yǔ)言的快速入門(mén)示例客戶(hù)端應(yīng)用程序,您可以使用這些應(yīng)用程序測(cè)試常見(jiàn)的方案。這有助于加深您對(duì) Data Access Application Block 的工作原理的了解。您還可以自定義源代碼以滿(mǎn)足自己的需要。
您可以編譯 Visual Basic 和 C# Microsoft.ApplicationBlocks.Data 項(xiàng)目,以生成一個(gè)名為 Microsoft.ApplicationBlocks.Data.dll 的程序集。該程序集包括一個(gè) SqlHelper 類(lèi)(其中包含用于執(zhí)行數(shù)據(jù)庫(kù)命令的核心功能)和一個(gè) SqlhelperParameterCache 類(lèi)(提供參數(shù)發(fā)現(xiàn)和緩存功能)。
文檔
Data Access Application Block 的文檔主要包括以下內(nèi)容:
- 使用 Data Access Application Block 開(kāi)發(fā)應(yīng)用程序。本部分包括快速入門(mén)示例,其中包含多種常見(jiàn)的使用情況,可以幫助您快速輕松地掌握 Data Access Application Block(數(shù)據(jù)訪(fǎng)問(wèn)應(yīng)用程序塊)的使用。
- Data Access Application Block 的設(shè)計(jì)與實(shí)現(xiàn)。本部分包括背景設(shè)計(jì)原理信息,以便用戶(hù)深入了解 Data Access Application Block 的設(shè)計(jì)與實(shí)現(xiàn)。
- 部署和運(yùn)行。本部分包括安裝信息,其中包含部署和更新選項(xiàng)以及與安全性有關(guān)的信息。
- 參考。本部分包含綜合的 API 參考,其中詳細(xì)介紹了構(gòu)成 Data Access Application Block 的類(lèi)和接口。
系統(tǒng)要求
要運(yùn)行 Data Access Application Block,需要滿(mǎn)足以下要求:
- Microsoft Windows? 2000、Windows XP Professional
- .NET Framework SDK(英文)的 RTM 版本
- Visual Studio? .NET 的 RTM 版本(推薦,但不必需)
- SQL Server 7.0 或更高版本的數(shù)據(jù)庫(kù)服務(wù)器
下載并安裝 Data Access Application Block
您可以獲取一個(gè)包含已簽名的 Data Access Application Block 程序集和綜合文檔的 Windows 安裝程序文件。
安裝進(jìn)程將在您的“程序”菜單中創(chuàng)建一個(gè) Microsoft Application Blocks for .NET(用于 .NET 的 Microsoft 應(yīng)用程序塊)子菜單。該子菜單中有一個(gè) Data Access(數(shù)據(jù)訪(fǎng)問(wèn))子菜單,其中包括用于啟動(dòng)文檔的選項(xiàng)和用于啟動(dòng) Data Access Application Block Visual Studio .NET 解決方案的選項(xiàng)。
請(qǐng)轉(zhuǎn)到 MSDN Downloads(英文)進(jìn)行下載。
使用 Data Access Application Block
本節(jié)討論如何使用 Data Access Application Block 來(lái)執(zhí)行數(shù)據(jù)庫(kù)命令和管理參數(shù)。圖 1 顯示了 Data Access Application Block 的主要元素。
圖 1:Data Access Application Block
SqlHelper 類(lèi)提供了一組靜態(tài)方法,可以用來(lái)向 SQL Server 數(shù)據(jù)庫(kù)發(fā)出許多各種不同類(lèi)型的命令。
SqlHelperParameterCache 類(lèi)提供命令參數(shù)緩存功能,可以用來(lái)提高性能。該類(lèi)由許多 Execute 方法(尤其是那些只運(yùn)行存儲(chǔ)過(guò)程的重寫(xiě)方法)在內(nèi)部使用。數(shù)據(jù)訪(fǎng)問(wèn)客戶(hù)端也可以直接使用它來(lái)緩存特定命令的特定參數(shù)集。
使用 SqlHelper 類(lèi)執(zhí)行命令
SqlHelper 類(lèi)提供了五種 Shared (Visual Basic) 或 static (C#) 方法,它們是:ExecuteNonQuery、ExecuteDataset、ExecuteReader、ExecuteScalar 和 ExecuteXmlReader。實(shí)現(xiàn)的每種方法都提供一組一致的重載。這提供了一種很好的使用 SqlHelper 類(lèi)來(lái)執(zhí)行命令的模式,同時(shí)為開(kāi)發(fā)人員選擇訪(fǎng)問(wèn)數(shù)據(jù)的方式提供了必要的靈活性。每種方法的重載都支持不同的方法參數(shù),因此開(kāi)發(fā)人員可以確定傳遞連接、事務(wù)和參數(shù)信息的方式。類(lèi)中實(shí)現(xiàn)的所有方法都支持以下重載:
[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 之外的其他方法還提供了另一種重載:允許將連接信息作為連接字符串而不是連接對(duì)象來(lái)傳遞,如下面的方法簽名所示:
[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 不支持連接字符串,因?yàn)椋号c SqlDataReader 對(duì)象不同,XmlReader 對(duì)象在 XmlReader 關(guān)閉時(shí)沒(méi)有提供自動(dòng)關(guān)閉連接的方法。如果客戶(hù)端傳遞了連接字符串,那么當(dāng)客戶(hù)端完成對(duì) XmlReader 的操作后,將無(wú)法關(guān)閉與 XmlReader 相關(guān)聯(lián)的連接對(duì)象。
通過(guò)參考 Data Access Application Block 程序集并導(dǎo)入 Microsoft.ApplicationBlocks.Data 命名空間,您可以輕松編寫(xiě)使用任何一種 SqlHelper 類(lèi)方法的代碼,如下面的代碼示例所示:
[Visual Basic] Imports Microsoft.ApplicationBlocks.Data [C#] using Microsoft.ApplicationBlocks.Data;
導(dǎo)入命名空間后,您可以調(diào)用任何 Execute* 方法,如下面的代碼示例所示:
[Visual Basic] Dim ds As DataSet = SqlHelper.ExecuteDataset( _ "SERVER=(local);DATABASE=Northwind;INTEGRATED SECURITY=True;", _ CommandType.Text, "SELECT * FROM Products") [C#] DataSet ds = SqlHelper.ExecuteDataset( "SERVER=DataServer;DATABASE=Northwind;INTEGRATED SECURITY=sspi;", _ CommandType.Text, "SELECT * FROM Products");
使用 SqlHelperParameterCache 類(lèi)管理參數(shù)
SqlHelperParameterCache 類(lèi)提供了三種可以用來(lái)管理參數(shù)的公共共享方法。它們是:
- CacheParameterSet。用于將 SqlParameters 數(shù)組存儲(chǔ)到緩存中。
- GetCachedParameterSet。用于檢索緩存的參數(shù)數(shù)組的副本。
- GetSpParameterSet。一種重載方法,用于檢索指定存儲(chǔ)過(guò)程的相應(yīng)參數(shù)(首先查詢(xún)一次數(shù)據(jù)庫(kù),然后緩存結(jié)果以便將來(lái)查詢(xún))。
緩存和檢索參數(shù)
通過(guò)使用 CacheParameterSet 方法,可以緩存 SqlParameter 對(duì)象數(shù)組。此方法通過(guò)將連接字符串和命令文本連接起來(lái)創(chuàng)建一個(gè)鍵,然后將參數(shù)數(shù)組存儲(chǔ)在 Hashtable 中。
要從緩存中檢索參數(shù),請(qǐng)使用 GetCachedParameterSet 方法。此方法將返回一個(gè) SqlParameter 對(duì)象數(shù)組,這些對(duì)象已使用緩存(與傳遞給該方法的連接字符串和命令文本相對(duì)應(yīng))中的參數(shù)的名稱(chēng)、值、方向和數(shù)據(jù)類(lèi)型等進(jìn)行了初始化。
注意:
用作參數(shù)集的鍵的連接字符串通過(guò)簡(jiǎn)單的字符串比較進(jìn)行匹配。用于從 GetCachedParameterSet 中檢索參數(shù)的連接字符串必須與用來(lái)通過(guò) CacheParameterSet 來(lái)存儲(chǔ)這些參數(shù)的連接字符串完全相同。語(yǔ)法不同的連接字符串即使語(yǔ)義相同,也不會(huì)被認(rèn)為是匹配的。
以下代碼顯示了如何使用 SqlHelperParameterCache 類(lèi)來(lái)緩存和檢索 Transact-SQL 語(yǔ)句的參數(shù)。
[Visual Basic] ' 初始化連接字符串和命令文本 ' 它們將構(gòu)成用來(lái)存儲(chǔ)和檢索參數(shù)的鍵 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" ' 緩存參數(shù) Dim paramsToStore(1) As SqlParameter paramsToStore(0) = New SqlParameter("@Cat", SqlDbType.Int) paramsToStore(1) = New SqlParameter("@Sup", SqlDbType.Int) SqlHelperParameterCache.CacheParameterSet(CONN_STRING, _ sql, _ paramsToStore) ' 從緩存中檢索參數(shù) Dim storedParams(1) As SqlParameter storedParams = SqlHelperParameterCache.GetCachedParameterSet( _ CONN_STRING, sql) storedParams(0).Value = 2 storedParams(1).Value = 3 ' 在命令中使用參數(shù) Dim ds As DataSet ds = SqlHelper.ExecuteDataset(CONN_STRING, _ CommandType.Text, _ sql, storedParams) [C#] // 初始化連接字符串和命令文本 // 它們將構(gòu)成用來(lái)存儲(chǔ)和檢索參數(shù)的鍵 const string CONN_STRING = "SERVER=(local); DATABASE=Northwind; INTEGRATED SECURITY=True;"; string spName = "SELECT ProductName FROM Products " + "WHERE Category=@Cat AND SupplierID = @Sup"; // 緩存參數(shù) SqlParameter[] paramsToStore = new SqlParameter[2]; paramsToStore[0] = New SqlParameter("@Cat", SqlDbType.Int); paramsToStore[1] = New SqlParameter("@Sup", SqlDbType.Int); SqlHelperParameterCache.CacheParameterSet(CONN_STRING, sql, paramsToStore); // 從緩存中檢索參數(shù) SqlParameter storedParams = new SqlParameter[2]; storedParams = SqlHelperParameterCache.GetCachedParameterSet( CONN_STRING, sql); storedParams(0).Value = 2; storedParams(1).Value = 3; // 在命令中使用參數(shù) DataSet ds; ds = SqlHelper.ExecuteDataset(CONN_STRING, CommandType.StoredProcedure, sql, storedParams);
檢索存儲(chǔ)過(guò)程參數(shù)
SqlHelperParameterCache 還提供了針對(duì)特定存儲(chǔ)過(guò)程檢索參數(shù)數(shù)組的方法。一種名為 GetSpParameterSet 的重載方法提供了此功能,它包含兩種實(shí)現(xiàn)。該方法嘗試從緩存中檢索特定存儲(chǔ)過(guò)程的參數(shù)。如果這些參數(shù)尚未被緩存,則使用 .NET 的 SqlCommandBuilder 類(lèi)從內(nèi)部檢索,并將它們添加到緩存中,以便用于后續(xù)的檢索請(qǐng)求。然后,為每個(gè)參數(shù)指定相應(yīng)的參數(shù)設(shè)置,最后將這些參數(shù)以數(shù)組形式返回給客戶(hù)端。以下代碼顯示了如何檢索 Northwind 數(shù)據(jù)庫(kù)中 SalesByCategory 存儲(chǔ)過(guò)程的參數(shù)。
[Visual Basic] ' 初始化連接字符串和命令文本 ' 它們將構(gòu)成用來(lái)存儲(chǔ)和檢索參數(shù)的鍵 Const CONN_STRING As String = _ "SERVER=(local); DATABASE=Northwind; INTEGRATED SECURITY=True;" Dim spName As String = "SalesByCategory" ' 檢索參數(shù) Dim storedParams(1) As SqlParameter storedParams = SqlHelperParameterCache.GetSpParameterSet( _ CONN_STRING, spName) storedParams(0).Value = "Beverages" storedParams(1).Value = "1997" ' 在命令中使用參數(shù) Dim ds As DataSet ds = SqlHelper.ExecuteDataset(CONN_STRING, _ CommandType.StoredProcedure, _ spName, storedParams) [C#] // 初始化連接字符串和命令文本 // 它們將構(gòu)成用來(lái)存儲(chǔ)和檢索參數(shù)的鍵 const string CONN_STRING = "SERVER=(local); DATABASE=Northwind; INTEGRATED SECURITY=True;"; string spName = "SalesByCategory"; // 檢索參數(shù) SqlParameter storedParams = new SqlParameter[2]; storedParams = SqlHelperParameterCache.GetSpParameterSet( CONN_STRING, spName); storedParams[0].Value = "Beverages"; storedParams[1].Value = "1997"; // 在命令中使用參數(shù) DataSet ds; ds = SqlHelper.ExecuteDataset(CONN_STRING, CommandType.StoredProcedure, spName, storedParams);
內(nèi)部設(shè)計(jì)
Data Access Application Block 包含了完整的源代碼和有關(guān)其設(shè)計(jì)的綜合指南。本節(jié)介紹有關(guān)主要實(shí)現(xiàn)的詳細(xì)信息。
SqlHelper 類(lèi)實(shí)現(xiàn)詳細(xì)信息
SqlHelper 類(lèi)用于通過(guò)一組靜態(tài)方法來(lái)封裝數(shù)據(jù)訪(fǎng)問(wèn)功能。該類(lèi)不能被繼承或?qū)嵗虼藢⑵渎暶鳛榘瑢?zhuān)用構(gòu)造函數(shù)的不可繼承類(lèi)。
在 SqlHelper 類(lèi)中實(shí)現(xiàn)的每種方法都提供了一組一致的重載。這提供了一種很好的使用 SqlHelper 類(lèi)來(lái)執(zhí)行命令的模式,同時(shí)為開(kāi)發(fā)人員選擇訪(fǎng)問(wèn)數(shù)據(jù)的方式提供了必要的靈活性。每種方法的重載都支持不同的方法參數(shù),因此開(kāi)發(fā)人員可以確定傳遞連接、事務(wù)和參數(shù)信息的方式。在 SqlHelper 類(lèi)中實(shí)現(xiàn)的方法包括:
- ExecuteNonQuery。此方法用于執(zhí)行不返回任何行或值的命令。這些命令通常用于執(zhí)行數(shù)據(jù)庫(kù)更新,但也可用于返回存儲(chǔ)過(guò)程的輸出參數(shù)。
- ExecuteReader。此方法用于返回 SqlDataReader 對(duì)象,該對(duì)象包含由某一命令返回的結(jié)果集。
- ExecuteDataset。此方法返回 DataSet 對(duì)象,該對(duì)象包含由某一命令返回的結(jié)果集。
- ExecuteScalar。此方法返回一個(gè)值。該值始終是該命令返回的第一行的第一列。
- ExecuteXmlReader。此方法返回 FOR XML 查詢(xún)的 XML 片段。
除了這些公共方法外,SqlHelper 類(lèi)還包含一些專(zhuān)用函數(shù),用于管理參數(shù)和準(zhǔn)備要執(zhí)行的命令。不管客戶(hù)端調(diào)用什么樣的方法實(shí)現(xiàn),所有命令都通過(guò) SqlCommand 對(duì)象來(lái)執(zhí)行。在 SqlCommand 對(duì)象能夠被執(zhí)行之前,所有參數(shù)都必須添加到 Parameters 集合中,并且必須正確設(shè)置 Connection、CommandType、CommandText 和 Transaction 屬性。SqlHelper 類(lèi)中的專(zhuān)用函數(shù)主要用于提供一種一致的方式,以便向 SQL Server 數(shù)據(jù)庫(kù)發(fā)出命令,而不考慮客戶(hù)端應(yīng)用程序調(diào)用的重載方法實(shí)現(xiàn)。SqlHelper 類(lèi)中的專(zhuān)用實(shí)用程序函數(shù)包括:
- AttachParameters:該函數(shù)用于將所有必要的 SqlParameter 對(duì)象連接到正在運(yùn)行的 SqlCommand。
- AssignParameterValues:該函數(shù)用于為 SqlParameter 對(duì)象賦值。
- PrepareCommand:該函數(shù)用于對(duì)命令的屬性(如連接、事務(wù)環(huán)境等)進(jìn)行初始化。
- ExecuteReader:此專(zhuān)用 ExecuteReader 實(shí)現(xiàn)用于通過(guò)適當(dāng)?shù)?CommandBehavior 打開(kāi) SqlDataReader 對(duì)象,以便最有效地管理與閱讀器關(guān)聯(lián)的連接的有效期。
SqlHelperParameterCache 類(lèi)實(shí)現(xiàn)詳細(xì)信息
參數(shù)數(shù)組緩存在專(zhuān)用 Hashtable 中。從緩存中檢索的參數(shù)進(jìn)行內(nèi)部復(fù)制,這樣客戶(hù)端應(yīng)用程序能夠更改參數(shù)值以及進(jìn)行其他操作,而不會(huì)影響緩存的參數(shù)數(shù)組。專(zhuān)用共享函數(shù) CloneParameters 可以實(shí)現(xiàn)此目的。
常見(jiàn)問(wèn)題
此版本包含哪些新增功能?
與 Data Access Application Block Beta 2.0 版本相比,該 RTM 版本包含以下新增功能和變化:
- SqlHelper 類(lèi)方法的事務(wù)型重載不再需要 SqlConnection 參數(shù)。在此版本中,連接信息從 SqlTransaction 對(duì)象中派生,因此不必在方法簽名中包含 SqlConnection 對(duì)象參數(shù)。
- 現(xiàn)在,GetSpParameterSet 方法使用 ADO.NET CommandBuilder 類(lèi)的 DeriveParameters 方法來(lái)確定存儲(chǔ)過(guò)程所需要的參數(shù)。這比 Beta 2.0 版本中直接通過(guò)查詢(xún)數(shù)據(jù)庫(kù)來(lái)檢索信息的效率更高。
可以使用 XCOPY 部署方法來(lái)部署 Data Access Application Block 程序集嗎?
可以。Microsoft.ApplicationBlocks.Data.dll 程序集在編譯后可以使用 XCOPY 進(jìn)行部署。
什么時(shí)候應(yīng)該使用 ExecuteDataset 方法,什么時(shí)候應(yīng)該使用 ExecuteReader 方法?
這個(gè)問(wèn)題實(shí)際上是什么時(shí)候應(yīng)該返回 DataSet 對(duì)象中的多個(gè)數(shù)據(jù)行,什么時(shí)候應(yīng)該使用 DataReader。答案取決于您的應(yīng)用程序的特定需要,以及您在靈活性和原始性能之間的取舍。DataSet 為您提供數(shù)據(jù)的靈活的且斷開(kāi)連接的關(guān)系視圖,而 DataReader 為您提供性能卓越的、只讀的、僅向前光標(biāo)。有關(guān) DataSet 和 DataReader 的全面比較,請(qǐng)參閱 Data Access Architecture Guide(英文)。
如何使用 ExecuteDataset 返回包含多個(gè)表的數(shù)據(jù)集?
通過(guò)創(chuàng)建一個(gè)可以返回多個(gè)行集的存儲(chǔ)過(guò)程(通過(guò)執(zhí)行多個(gè) SELECT 語(yǔ)句或者對(duì)其他存儲(chǔ)過(guò)程進(jìn)行嵌套調(diào)用),并使用 ExecuteDataset 方法執(zhí)行該過(guò)程,您可以檢索包含多個(gè)表的數(shù)據(jù)集。
例如,假設(shè)您的數(shù)據(jù)庫(kù)包含以下存儲(chǔ)過(guò)程。
CREATE PROCEDURE GetCategories AS SELECT * FROM Categories GO CREATE PROCEDURE GetProducts AS SELECT * FROM Products
您可以創(chuàng)建一個(gè)主存儲(chǔ)過(guò)程來(lái)對(duì)這些過(guò)程進(jìn)行嵌套調(diào)用,如下面的代碼示例所示。
CREATE PROCEDURE GetCategoriesAndProducts AS BEGIN EXEC GetCategories EXEC GetProducts END
使用 ExecuteDataset 方法執(zhí)行此主存儲(chǔ)過(guò)程將返回一個(gè) DateSet,其中包含兩個(gè)表:一個(gè)表包含分類(lèi)數(shù)據(jù),另一個(gè)表包含產(chǎn)品數(shù)據(jù)。
注意:
ExecuteDataset 方法不提供為返回的表指定自定義名稱(chēng)的方法。第一個(gè)表的編號(hào)始終為 0,名稱(chēng)為 Table,第二個(gè)表的編號(hào)為 1,名稱(chēng)為 Table1,依此類(lèi)推。
還有其他的應(yīng)用程序塊嗎?
Data Access Application Block 是即將發(fā)布的幾個(gè)應(yīng)用程序塊之一。這些應(yīng)用程序塊可以解決開(kāi)發(fā)人員在不同項(xiàng)目中遇到的共同問(wèn)題。它們可以快速方便地插入到 .NET 應(yīng)用程序中。
反饋和支持
如果您對(duì) Data Access Application Block 有任何問(wèn)題、意見(jiàn)和建議,請(qǐng)向 devfdbck@microsoft.com 發(fā)送電子郵件,我們將及時(shí)提供反饋。
Application Blocks for .NET 旨在協(xié)助開(kāi)發(fā) .NET 分布式應(yīng)用程序。示例代碼和文檔都按原樣提供。盡管已經(jīng)過(guò)測(cè)試并被認(rèn)為是穩(wěn)定的代碼集,但我們并不象傳統(tǒng)的 Microsoft 產(chǎn)品那樣對(duì)其提供支持。
我們還創(chuàng)建了一個(gè)新聞組,可以幫助您使用 Application Blocks for .NET(.NET 應(yīng)用程序塊)。您可以通過(guò)新聞組在聯(lián)機(jī)的開(kāi)放論壇中向同行、同事和 Microsoft 支持專(zhuān)家咨詢(xún)。
其他人也可以從您的問(wèn)題和評(píng)論中獲益,我們的開(kāi)發(fā)小組將每天查看新聞組:
新聞組:基于 Web 的讀者
http://msdn.microsoft.com/newsgroups/loadframes.asp?icp=msdn&slcid=us&newsgroup=microsoft.public.dotnet.distributed_apps(英文)
新聞組:NNTP 讀者
news://msnews.microsoft.com/microsoft.public.dotnet.distributed_apps(英文)
您想學(xué)習(xí)和利用 .NET 的功能嗎?歡迎您與 Microsoft Technology Centers 的技術(shù)專(zhuān)家并肩工作,您將學(xué)到最好的開(kāi)發(fā)經(jīng)驗(yàn)。有關(guān)詳細(xì)信息,請(qǐng)?jiān)L問(wèn) http://www.microsoft.com/business/services/mtc.asp(英文)。
您需要更多的幫助嗎?請(qǐng)?jiān)L問(wèn)新增的客戶(hù)支持服務(wù) Advisory Services,該解決方案可以滿(mǎn)足您小規(guī)模的咨詢(xún)需要。有關(guān) Advisory Services 的詳細(xì)信息,請(qǐng)?jiān)L問(wèn) http://support.microsoft.com/default.aspx?id=fh;EN-US;advisoryservice(英文)。
更多信息
Data Access Application Block 的設(shè)計(jì)和開(kāi)發(fā)是建立在 Data Access in .NET Architecture Guide(英文)中討論的最佳開(kāi)發(fā)經(jīng)驗(yàn)和通用設(shè)計(jì)原則基礎(chǔ)之上的。請(qǐng)閱讀該指南,以了解有關(guān)數(shù)據(jù)訪(fǎng)問(wèn)的詳細(xì)信息。