ADO.NET 2.0 功能一览 --作者:Bob Beauchemin
??? [導讀]ADO.NET 2.0包含一個新的基類提供程序模型,適用于所有提供程序的功能以及對System.Data.SqlClient進行的更改。通過本文,您可以獲得有關這些新功能的概述、它們的用法示例以及說明哪些功能不特定于提供程序和哪些功能特定于SqlClient的圖表。
??? ADO.NET 2.0隨附了大量的新功能,這包括一個新的基于基類的提供程序模型、所有提供程序都可以利用的功能以及特定于System.Data.SqlClient的更改。因為.NET Framework 2.0是與SQL Server 2005一起發布的,所以其中的一些功能要求在SQL Server 2005種也可用。本文旨在充當新功能的概述和路線圖,提供它們的用法示例,并且包含了一個說明哪些功能不特定于提供程序和哪些功能特定于SqlClient的圖表。
基于基類的提供程序模型
??? 在ADO.NET 1.0和1.1中,提供程序編寫器實現了一系列特定于提供程序的類。基于每個類都實現了一個通用接口的事實,所以,可以利用通用編碼。例如,System.Data.SqlClient包含類SqlConnection,并且該類實現了IDbConnection。System.Data.OracleClient包含類OracleConnection,后者也實現了IDbConnection。特定于提供程序的類可以實現特定于數據源的屬性和方法,例如,SqlConnection可以實現Database屬性和ChangeDatabase方法。但OracleConnection不是這樣,因為Oracle數據庫不具有每個數據庫實例擁有多個“數據庫”(它們在ANSI SQL中稱為編錄)的概念。ADO.NET 2.0中的新提供程序模型基于System.Data.Common中的一系列基類。這些基類提供了常見功能的基本實現,當然,其中的每個基類還實現了仍然需要的通用接口,以便向后兼容。提供程序編寫器可以選擇使用基類或者支持接口。以前版本中的接口模型有兩個特例:DataAdapter/DbDataAdapter和CommandBuilder。CommandBuilder類為一個簡單的SELECT命令提供了對使用相同列集的INSERT、UPDATE和DELETE命令的自動實現。在保持CommandBuilder用于創建操作語句的基本算法的同時對其進行擴展是不可能的,因為SqlCommandBuilder是一個密封類。盡管仍然無法重用SqlCommandBuilder參數分析程序,但是System.Data.Common中有一個DbCommandBuilder基類。在這些類的基類級別也公開了新功能,DataAdapter/DbDataAdapter基類公開了用于將特定于提供程序的類型(如SQL Server SqlTypes)推到數據集(ReturnProviderSpecificTypes屬性)中以及進行批更新(StatementType.Batch枚舉值和UpdateBatchSize屬性)的機制。DbCommandBuilder公共基類包含了一個用于指示并發策略選擇的屬性(ConflictDetection屬性)。
提供程序工廠
??? ADO.NET 1.0和1.1中基于接口的方法的復雜性之一在于:您無法在接口上調用構造函數,您必須創建特定類的具體實例。以前的API(如OLE DB和ADO)通過重載連接字符串來解決這一問題。連接字符串包含提供程序的COM PROGID,而正確的DataSource類是基于該PROGID創建的。因為OLE DB DataSource PROGID存儲在注冊表中,所以這是可能的。
' VB6 ADO code, Connection is an interface (actually it's _Connection)
Dim conn as Connection
' note that the default provider is MSDASQL, the OLE DB provider for ODBC
' this uses the OLE DB provider for SQL Server
conn.ConnectionString = "provider=sqloledb;.." ' other parameters deleted
conn.Open
??? ADO.NET 2.0具有與此對應的解決方案。每個數據提供程序都在.NET machine.config中注冊了一個ProviderFactory類和一個提供程序字符串。有一個ProviderFactory基類(DbProviderFactory)和一個System.Data.Common.ProviderFactories類,可以返回有關machine.config中注冊的不同數據提供程序信息的DataTable,而且還可以在給定該DataTable中的提供程序字符串(稱為ProviderInvariantName)或DataRow的情況下檢索正確的ProviderFactory。以前通常按如下方式編寫條件代碼:
enum provider {sqlserver, oracle, oledb, odbc};
// determine provider from configuration
provider prov = GetProviderFromConfigFile();
IDbConnection conn = null;
switch (prov) {
??? case provider.sqlserver:
??????? conn = new SqlConnection();
??????? break;
??? case provider.oracle:
??????? conn = new OracleConnection();
??????? break;
??? case provider.oledb:
??????? conn = new OleDbConnection();
??????? break;
??? case provider.odbc:
??????? conn = new OdbcConnection();
??????? break;
??? // add new providers as the application supports them
}
??? 現在可以按如下方式編寫:
// get ProviderInvariantString from configuration
string provstring = GetProviderInvariantString();
DbProviderFactory fact = DbProviderFactories.GetFactory(provstring);
IDbConnection = fact.CreateConnection();
??? 由于出現了用于檢索安裝在計算機上的數據提供程序以及為每個數據提供程序檢索ProviderFactory的標準,因此帶來了其他一些有趣的可能性。
服務器枚舉
??? Machine.config中的提供程序配置項目指定了一個位掩碼,以指示該提供程序支持哪些基類或基接口。這是因為并非所有的數據提供程序都需要支持System.Data.Common中的所有功能。例如,CommandBuilder是一個“最好具有”的類,但是沒有它您也可以很好地完成工作。DbEnumerator是一個新的基類,它已經被添加到ADO.NET 2.0的混合功能中。該類使支持它的數據提供程序可以獲得數據源列表。例如,SqlClient支持該類并且返回網絡中可用的SQL Server實例的列表。這使得程序和工具可以為用戶提供精選的數據源。使用這一功能的工具之一是Visual Studio 2005。
連接字符串生成器和元數據架構
??? 直到現在,Visual Studio .NET仍然使用OLE DB組件生成連接字符串以表示數據源。當您使用Visual Studio 2005中的服務器資源管理器在Visual Studio .NET 2003中添加新的數據連接時,它會顯示OLE DB連接字符串生成器,該生成器會列出計算機上安裝的OLE DB提供程序而不是.NET數據提供程序。然后,它允許您選擇一個提供程序(雖然是OLE DB提供程序),并為相應的提供程序生成一個ADO.NET連接字符串。在Visual Studio 2005中,上面提到的DbProviderFactories可以為您顯示一列.NET數據提供程序,并且圖形用戶界面組件使用類DbConnectionStringBuilder使程序員能夠以圖形方式生成連接字符串,以及從配置文件中加載連接字符串和在配置文件中存儲連接字符串。Visual Studio 2005服務器資源管理器還可以獲取數據源元數據(例如表、列、視圖和存儲過程的列表)以進行顯示。ANSI SQL規范具有對應于該元數據的基本規范,該規范稱為INFORMATION_SCHEMA視圖。這些通用視圖是一個很好的起點,但有時需要用特定于數據庫的視圖或信息進行擴展。在ADO.NET 2.0中,數據提供程序可以提供一個XML格式的配置文件,以列出哪些元數據可用以及如何從數據庫中獲得它們,這是因為并非所有的數據庫都支持INFORMATION_SCHEMA視圖。這將在允許工具程序員( tool programmer)獲得提供程序定義的擴展信息集方面提供巨大的幫助。
跟蹤
??? 允許程序員和技術支持人員在獲得來自用戶的說明或來自程序的錯誤信息之后,對數據庫API的調用進行跟蹤以查明問題位于數據訪問堆棧中的哪個位置,將會非常有用。通常,問題可能產生于下列方面:
??? 在過去,編寫代碼以允許跟蹤的工作是留給各個提供程序編寫者完成的,盡管在某些API(例如ODBC)中存在一些事實上的標準。由于缺少標準的OLE DB跟蹤,因此解決OLE DB和ADO問題變得更為困難。盡管這不是ADO.NET所獨有的體系結構,但ADO.NET 2.0中的Microsoft提供程序利用了一般化的跟蹤和檢測API。使用這一新功能,您將能夠在應用程序堆棧的任何級別跟蹤問題。不僅Microsoft ADO.NET提供程序被檢測,而且數據訪問堆棧的其他部分也使用了該功能,并且提供程序編寫者也可以實現該功能。甚至ADO.NET 2.0數據集和相關的類也具有內置的診斷機制。我將在以后的文章中深入討論跟蹤。
SqlClient增強
??? Microsoft的主打數據庫是SQL Server,而SqlClient是特定于SQL Server的提供程序。ADO.NET 2.0實際上隨附了四個Microsoft提供程序:
??? 在ADO.NET 2.0中,已經對上述所有四個提供程序進行了增強,以便能夠在部分受信任的環境中使用它們。通過正確地配置.NET代碼訪問安全性(CAS),可以啟用更多以數據為中心的移動代碼方案。在ADO.NET 1.1中,只有SqlClient提供程序支持該功能。此外,數據提供程序由數據庫公司(Oracle的ODP.NET和IBM的用于DB2的數據提供程序)、提供程序專業公司(DataDirect Technologies)、開放源代碼項目和個人編寫。此外,Microsoft將在Host Integration Server 2004產品中隨附DB2數據提供程序。因為SQL Server是軟件難題的一個重要部分,所以除了對所有Microsoft支持的提供程序的增強以外,還有許多對ADO.NET 2.0中的SqlClient進行的增強。該功能的某些部分支持任何版本的SQL Server,而該新功能的大部分旨在支持SQL Server 2005(它的代號“Yukon”可能更容易為大家所知)中提供的許多新功能。SQL Server 2005支持在該服務器內部運行的.NET代碼,而且在使用提供程序模型的服務器內部還有對數據訪問的優化。一項較大的內部更改(并不顯而易見)是,ADO.NET 2.0中的SqlClient數據提供程序不使用Microsoft數據訪問組件(MDAC)。在該提供程序中還有更好的錯誤處理,網絡錯誤的錯誤信息更加清楚,并且錯誤信息在總體上更加具體。以下是供程序員參閱的特定于SqlClient的功能概述。
連接池增強
??? ADO.NET 1.0引入了一種用于匯集數據庫連接的新基礎結構。Microsoft SqlClient和OracleClient數據提供程序使用該基礎結構,而OleDb和Odbc數據提供程序不使用該基礎結構。新的池機制提供對連接池參數的粒度支持,包括最小和最大池大小以及池管理者等待將連接在池中變為可用的連接所需的用戶自定義時間量的能力。ADO.NET添加了連接池增強功能,以使您能夠以編程方式“排干”連接池;即關閉當前由匯集者保持活動的所有連接。您可以使用靜態(在Visual Basic .NET中共享)方法SqlConnection.ClearPool清除特定的連接池,或者使用SqlConnection.ClearPools方法清除應用程序域中的所有連接池。SqlClient和OracleClient都實現了該功能。
異步命令
??? 有時,您希望在客戶端或中間件代碼中同時完成一件以上的工作,在本來就是多線程的中間件代碼中,這是提高吞吐量的關鍵因素。在ADO.NET 2.0中,SqlClient目前支持異步命令執行。異步操作的.NET范型除了為同步操作提供一個方法以外,還能夠為操作提供一組Begin和End方法。因為數據庫命令的執行可能需要很長時間,所以SqlClient現在提供了內置的SqlCommand方法以便提供異步執行。下表列出了支持異步執行的方法和它們的同步對應方法。
| ExecuteNonQuery | BeginExecuteNonQuery EndExecuteNonQuery |
| ExecuteReader | BeginExecuteReader EndExecuteReader |
| ExecuteXmlReader | BeginExecuteXmlReader EndExecuteXmlReader |
??? 盡管異步執行可能是很好的功能,但不應當無故使用它,只有當您知道命令可能會運行很長時間并且您同時要完成某些有用的任務時才應該使用它。Windows NT系列操作系統中的Windows線程調度程序(該功能在Windows 9x和Me客戶端上不可用)可花費它自己的開銷以便在線程之間切換。同時請記住,某些.NET庫是線程敏感型的;使用異步時,用于啟動操作的線程未必是完成該操作的同一線程。但是,SQL Server網絡庫堆棧已經進行了增強,以便通過I/O完成端口來支持異步,并且這為異步SQL Server操作提供了更好的吞吐量。異步操作不但可以對多個操作語句和存儲過程執行有效,而且在將其與SQL Server 2005中的多個活動結果集功能結合使用時,您還可以使用單個數據庫連接多路復用異步SELECT語句。
批量導入
??? 很多數據庫應用程序可以快速、大批量地將行“插入”到SQL Server中。這方面的典型示例是一個將行插入SQL Server的應用程序,這些行對應于從硬件設備(例如電話交換機或醫院患者監視器)進行的讀取操作。盡管SQL Server隨附了實用工具(例如bcp)以適應這種情況,但這些實用工具通常使用文件作為它們的輸入。SqlClient包含一個名為SqlBulkCopy的新類。該類的目的不是像BCP那樣直接消耗來自文件的輸入并產生文件輸出,而是為了適應快速而有效地將很多行從客戶端插入到數據庫中這一情況。SqlBulkCopy可以從數據讀取器和數據集獲得它的輸入。這意味著,您不僅可以直接從提供程序流式傳輸一系列行(DataReader),還可以用從硬件設備(不是提供程序)獲得的外部數據填充數據集以及直接更新數據集;在這種情況下,不需要任何提供程序作為源。
// Fill up a DataSet
DataSet ds = new DataSet();
FillDataSetFromHardwareDevice(ds);
// Copy the Data to SqlServer
string connect_string = GetConnectStringFromConfigFile();
SqlBulkCopy bcp = new SqlBulkCopy(connect_string);
bcp.DestinationTableName = "hardware_readings";
bcp.WriteToServer(ds);
提供程序統計信息
??? 某些應用程序編寫者發現在他們的應用程序中進行“實時”監視很有用。盡管您可以使用Windows性能監視器定義自己的性能類,以及使用內部的(并且可能會隨著時間的推移而變得脆弱)SQL Server元數據調用來獲得該信息,但SqlClient現在具有一種能夠為您提供該信息的內置方式。通過SqlConnection類上的一個實例方法,您可以獲得每個連接的統計信息(它們類似于ODBC API中提供的信息)。因為存儲和收集這些統計信息需要花費自己的開銷,所以有一個可以用來切換統計信息收集的屬性。還有一個用于重置計數器的方法。當然,默認情況下會關閉統計信息收集;而且,當您通過在池方案中調用Dispose或Close將連接返回到連接池時會啟動該功能。以下是產生的統計信息的示例:
string connect_string = GetConnectStringFromConfigFile();
SqlConnection conn = new SqlConnection(connect_string);
conn.Open();
// Enable
conn.StatisticsEnabled = true;
// do some operations
//
SqlCommand cmd = new SqlCommand("select * from authors", conn);
SqlDataReader rdr = cmd.ExecuteReader();
Hashtable stats = (Hashtable)conn.RetrieveStatistics();
// process stats
IDictionaryEnumerator e = stats.GetEnumerator();
while (e.MoveNext())
??? Console.WriteLine("{0} : {1}", e.Key, e.Value);
conn.ResetStatistics();
Connection-specific statistics
BuffersReceived : 1
BuffersSent : 1
BytesReceived : 220
BytesSent : 72
ConnectionTime : 149
CursorFetchCount : 0
CursorFetchTime : 0
CursorOpens : 0
CursorUsed : 0
ExecutionTime : 138
IduCount : 0
IduRows : 0
NetworkServerTime : 79
PreparedExecs : 0
Prepares : 0
SelectCount : 0
SelectRows : 0
ServerRoundtrips : 1
SumResultSets : 0
Transactions : 0
UnpreparedExecs : 1
??? 有關這些統計信息所代表的確切含義的詳細信息,請參閱ADO.NET 2.0或ODBC文檔。
AttachDbFileName
??? SqlClient數據提供程序支持桌面應用程序(其中,數據庫存儲在用戶的桌面上)以及客戶端-服務器應用程序和基于中間件的應用程序。有一種特殊版本的SQL Server,稱為MSDE;該產品的SQL Server 2005時代的名稱是SQL Server 2005 Express Edition。在桌面應用程序中,數據庫本身就特定于應用程序并且與應用程序捆綁在一起。用戶甚至可能不知道SQL Server正在被用作數據儲備庫,因為應用程序安裝程序將運行SQL Server Express安裝。為了便于將數據庫文件附加到應用程序內部的SQL Server Express實例,ADO.NET 1.0提供了一個連接字符串參數—AttachDbFileName。但是,必須將該參數指定為硬編碼的路徑名,以便使用戶難以在默認位置以外的其他位置安裝該應用程序。在ADO.NET 2.0中,AttachDbFileName參數可以是一個相對路徑,并且與應用程序配置設置一起使用。這使得為SQL Server Express設置桌面應用程序就像連接到基于Microsoft Access文件的數據存儲一樣容易。
SqlClient中特定于SQL Server 2005的功能
MARS
??? 當您使用SQL SELECT語句(作為獨立語句或者在存儲過程內部)選擇一個行集時,SQL Server不會像某些數據庫那樣自動在該行集上產生游標。相反,它使用優化的方法在網絡中流式傳輸結果集,并且有時會在網絡庫以數據包大小的塊拉入數據時直接從數據庫緩沖區中讀取。這在SQL Server聯機叢書中稱為“SQL Sever的默認結果集”或“無游標結果集”。在SQL Server 2005之前的SQL Server版本中,在單個連接上一次只能有一個活動的無游標結果集。不同的數據庫API和庫將以不同的方式處理這個連接/無游標結果集行為。如果您試圖打開第二個無游標結果集,則ADO.NET 1.0和1.1會產生錯誤;ADO“傳統型”實際上會在幕后打開一個新的數據庫連接。打開新的數據庫連接更為方便,盡管它不如產生錯誤那樣“精確”;這個方便的功能已經被某些程序員在無意中濫用,并且導致了比他們預料的更多的數據庫連接。在SQL Server 2005中,數據庫已經進行了增強,以允許多個無游標結果集同時在單個連接上處于活動狀態。這就產生了功能縮寫詞“MARS”(多個活動結果集)。網絡庫進行了一些更改以支持該行為,并且新的網絡庫和新的數據庫都需要啟用MARS。
??? 在SqlClient代碼中,您可以通過讓多個SqlCommand實例使用同一個連接來多路復用結果集。每個SqlCommand都可以容納一個通過調用Command.ExecuteReader產生的SqlDataReader,并且多個SqlDataReader可以串連使用。在ADO.NET 1.0和1.1中,您必須先關閉一個SqlDataReader才能獲得另一個—即使使用了多個SqlCommand。請注意,您無法多路復用從同一SqlCommand實例的多個ExecuteReader調用中產生的SqlDataReader。下面是一個簡短(但在功能上不是非常有用)的示例:
// connection strings should not be hardcoded
string connstr = GetConnStringFromConfigFile();
SqlConnection conn = new SqlConnection(connstr);
SqlCommand cmd1 = new SqlCommand(
??? "select * from employees", conn)
SqlCommand cmd2 = new SqlCommand(
??? "select * from jobs", conn)
SqlDataReader rdr1 = cmd1.ExecuteReader();
// next statement causes an error prior to SQL Server 2005
SqlDataReader rdr2 = cmd2.ExecuteReader();
// now you can reader from rdr1 and rdr2 at the same time.
??? 該功能不只是與減少錯誤有關,也不只是為了闡明曾經的ADO庫魅力,它與上述的異步操作結合使用時,可能極為有用。多個異步SELECT語句或存儲過程調用可以串連執行,從而節省了數據庫連接并優化了吞吐量。請想像一下使用單個連接在窗體上同時填充20個下拉列表框。您還可以在結果集處于活動狀態時執行無結果集返回語句。盡管同時可以有多個執行流處于活動狀態,但所有執行流都必須共享同一個事務(如果事務存在的話)。事務仍然屬于連接范圍而不是命令范圍。您可以通過像在以前版本的ADO.NET中那樣設置SqlCommand Transaction屬性來將SqlTransaction實例與SqlCommand相關聯。
SqlDependency和SqlNotificationRequest
??? 在中間層緩存情況下,如果能夠基于他人已經在數據庫中更改某行的事實來刷新緩存則極為有幫助。程序員已經借助于一些不同的技術來實現該目標,例如,編寫在表或視圖更改時更新文件的觸發器,或者無論數據庫更改與否都經常刷新緩存。在SqlClient SqlNotificationRequest類和SqlDependency類出現之前,沒有針對數據庫通知進行注冊的簡單方式。SqlDependency是一個高級別類,它包裝了SqlNotificationRequest并且將通知信息呈現為.NET事件。對于SqlNotificationRequest而言沒有事件,您必須自己完成注冊通知以及獲得信息的“繁重工作”。絕大多數程序員都將使用SqlDependency。SqlDependency可以用作獨立的類,并且在使用ASP.NET Cache類時可以直接使用它的功能。這一特定于SQL Server 2005的功能取決于SQL Server Service Broker—它是一項實現可伸縮隊列系統的新功能。請注意,在使用ASP.NET Cache類時,應使用數據庫輪詢而不是Service Broker來獲得類似的功能。在使用Service Broker和SQL Server 2005時,您不必為了獲得通知而維護到數據庫的連接。SqlDependency使用您選擇的HTTP或TCP協議,并且在基礎行更改時與您聯系。該通知不包含任何特定于行的信息,當您獲得通知時必須重新獲取整個行集并重新注冊該通知。該功能正是您對于單個緩存或有限的用戶組所需要的,但是當您對同時偵聽的大量用戶使用它時,請務必小心。當任一行更改時,每個用戶都必須刷新緩存中的整個行集。對于大量更改和大量用戶而言,用于刷新的SELECT語句可能會對數據庫產生重大影響。
密碼更改
??? SQL Server 2005提供了一種機制,以便使用與其他集成了登錄的密碼策略遵循同一過期機制的SQL登錄(連接到SQL Server的Windows登錄),該功能要求SQL Server 2005運行于Windows Server 2003上。如果SQL登錄密碼(例如“sa”)即將過期,則您將無法使用傳統的Windows機制和密碼更改API來更改它。您只能使用最終調用Transact SQL ALTER LOGIN的SQL Server客戶端來更改該密碼。SqlClient通過SqlConnection類上的ChangePassword方法適應這一機制。請注意,該方法只有在針對SQL Server 2005實例執行時才可用;盡管您可以在較舊版本的數據庫上更改SQL登錄,但該API使用的是其他SQL Server版本都不支持的網絡數據包類型。密碼更改的另一個需要考慮的方面是,在程序的連接字符串中不再對SQL Server登錄ID和密碼進行硬編碼。除非您將生成.NET中間語言并在每次密碼更改時都替換可執行文件(這不是一個可行的選擇),否則必須在配置文件中存儲您的SQL Server密碼。嚴謹的SQL Server開發人員已經在相當長的一段時間內使用配置文件來存儲(很可能是經過加密的)密碼。更好的做法是始終使用SQL Server集成安全性(如果可能)。
System.Transactions集成
??? ADO.NET 2.0中的SqlClient提供程序與新的System.Transactions命名空間相集成,從而啟用了稱為可升級事務的行為。盡管Transact SQL可以用來啟動本地或分布式事務(BEGIN TRANSACTION和BEGIN DISTRIBUTED TRANSACTION),但在某些情況下(特別是在客戶端/中間層編程方面),程序員可能希望編寫可以在一個數據庫方案或多個數據庫方案中使用的組件。這些方案可能包含多個SQL Server實例,并且SQL Server可以自動檢測到多實例訪問并將事務從本地“提升”到多實例(分布式)。即使在使用多個數據庫產品或多個連接的情況下,這也是可能的,前提是第一個數據庫(在分布式事務術語中稱為資源管理器)是SQL Server。在ADO.NET中,默認情況下啟用可升級的事務。
客戶端故障轉移
??? SQL Server 2005通過數據庫鏡像支持“熱備用(hot spare)”功能。如果SQL Server實例失敗,工作可以自動轉移到備份服務器。這需要一個稱為(并不意外)“目擊實例”的實例來見證故障轉移。熱備用方案還要求現有的客戶端連接必須“知道”故障轉移(建立與新服務器實例的連接)。在下一次嘗試訪問時產生錯誤并且必須通過客戶端編程手動進行“故障轉移”的客戶端連接是次最優的方案。ADO.NET 2.0中的SqlClient支持客戶端故障轉移,而不必對應用程序進行專門編程。
對新事務隔離級別的支持
??? SQL Server 2005通過兩個方法支持事務隔離:鎖定和版本控制。以前版本的SQL Server支持鎖定,但不支持版本控制。SQL Server 2005支持兩種類型的版本控制,它們被稱為語句級別版本控制和事務級別版本控制。該功能旨在有選擇地減少極端環境中的鎖定,并簡化為版本控制數據庫而設計的應用程序的轉換。為版本控制數據庫設計的應用程序在移植到鎖定數據庫時通常需要進行重大更改,反之亦然。版本控制數據庫的默認行為幾乎總是語句級別版本控制。有關差異的詳細信息,請參閱Beauchemin、Berglund和Sullivan撰寫的 A First Look at SQL Server 2005 for Developers(http://shopping.msn.com/search/detail.aspx?pcId=4644&prodId=2190289&ptnrid=141&ptnrdata=0)。
??? 不同的版本控制和鎖定行為等同于使用特定的事務隔離級別啟動事務。ANSI SQL規范定義了四個事務隔離級別:
- READ UNCOMMITED.
- READ COMMITTED.
- REPEATABLE READ.
- SERIALIZABLE.
??? SQL Server支持所有四個隔離級別,甚至在SQL Server 2005之前就是如此。版本控制數據庫通常僅支持READ COMMITTED和SERIALIZABLE。在版本控制數據庫中,READ COMMITTED實現語句級別版本控制,而SERIALIZABLE實現事務級別版本控制。READ COMMITTED是幾乎所有數據庫的默認行為,無論是使用鎖定還是使用版本控制。通過以數據庫為單位設置數據庫選項,可以啟用語句級別版本控制,并且使其成為默認行為。在啟用語句版本控制時,指定IsolationLevel.ReadCommitted或IsolationLevel.ReadUncommitted會使用該行為。為了支持事務級別隔離,SQL Server 2005定義了一個新的隔離級別—IsolationLevel.Snapshot,SqlClient(并且只有SqlClient)支持該隔離級別。該隔離級別是必需的,因為您可以分別啟用語句級別或事務級別的版本控制,并且IsolationLevel.Serializable已經由SQL Server使用以便與鎖定行為相對應。
數據類型——UDT、XML數據類型以及“MAX”BLOB和CLOB
??? SQL Server 2005添加了對用戶定義類型的支持,一個原生XML數據類型和更好的大型數據支持。它通過使用Transact SQL類型VARCHAR(MAX)、NVARCHAR(MAX)和VARBINARY(MAX)改進了大型數據支持。用戶定義的類型和原生XML類型由SQL:1999和SQL:2003規范定義。為了將這些數據類型與SqlClient一起使用,定義了System.Data.SqlTypes命名空間中的新類(SqlUdt和SqlXml),將支持添加到SqlDbTypes枚舉,并且增強了IDataReader.GetValue以支持將UDT作為.NET對象類型返回以及將XML作為.NET字符串返回。這些新的SQL Server 2005類型在SQL SELECT語句所返回的DataReader中受到支持,并且作為使用SqlParameter的參數。特殊的SqlMetaData類可以返回有關這些新數據類型的擴展屬性的信息(例如某個強類型XML列所依附的XML架構集合)或某個UDT的數據庫名稱。您可以直接從客戶端在通用代碼中以及在數據集中使用這些類型。最后,您可以從客戶端對“MAX”數據類型執行部分更新,這要求使用ADO.NET 2.0之前的特殊SQL函數。
小結
??? 唉呀!本文介紹了大量功能,很難用一兩句話就講清楚。為了避免您淹沒在這個新的功能海洋中,我在本文最后提供了一個圖表,其中列出了每個新功能以及使其正常工作所必需的數據庫、提供程序和版本。目前,我只具有ADO.NET中包含的四個提供程序的信息,但其他提供程序供應商可能不久就會加入進來。
[附注] 新功能可用性
| 提供程序工廠 | X | X | X |
| 過部分信任運行 | X | X | X |
| 服務器枚舉 | X | X | X |
| 連接字符串生成器 | X | X | X |
| 元數據架構 | X | X | X |
| 批更新支持 | X | X | X |
| 特定于提供程序的類型 | X | X | X |
| 沖突檢測 | X | X | X |
| 跟蹤支持 | X | X | X |
| 池增強 | SqlClient和OracleClient | X | X |
| MARS | X | ||
| SqlNotificationRequest | X | ||
| SqlDependency | X | ||
| IsolationLevel.Snapshot | X | ||
| 異步命令 | X | X | X |
| 客戶端故障轉移 | X | ||
| 批量導入 | X | X | X |
| 密碼更改API | X | ||
| 統計信息 | X | X | X |
| 新的數據類型 | X | ||
| 可升級的事務 | X | X | |
| AttachDbFileName | X | X |
??? 作者介紹:Bob Beauchemin是DevelopMentor的講師、課程作者和數據庫課程聯系人。他具有二十五年以上擔任以數據為中心的分布式系統架構師、程序員和管理員的經驗。他為Microsoft Systems Journal、SQL Server Magazine以及其他刊物撰寫有關ADO.NET、OLE DB和SQL Server的文章,并且是 《A First Look at SQL Server 2005 for Developers》和 《Essential ADO.NET》的作者。
總結
以上是生活随笔為你收集整理的ADO.NET 2.0 功能一览 --作者:Bob Beauchemin的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 系统学习Linux11点建议
- 下一篇: VB.NET实现DirectDraw9