關(guān)于更新ADO.NET數(shù)據(jù)源方法介紹
大家都知道ADO.NET是訪問(wèn)數(shù)據(jù)庫(kù)的一種技術(shù),想要學(xué)好編程我們首先就要會(huì)訪問(wèn)數(shù)據(jù)庫(kù),現(xiàn)在我們就來(lái)看看關(guān)于ADO.NET吧。在ADO中,有三種可能方式用于更新ADO.NET數(shù)據(jù)源。一個(gè)是通過(guò)直接SQL語(yǔ)句,如INSERT, DELETE 或 UPDATE,或稍復(fù)雜、較成熟的存儲(chǔ)過(guò)程。另一個(gè)是通過(guò)批更新,你一次可以向服務(wù)器遞交某個(gè)表的新映射。第三個(gè)方法是使用服務(wù)器指針直接對(duì)字段更新。
#T#ADO.NET完全支持前兩種技術(shù),這涉及到不是的對(duì)象和方法。至于服務(wù)器指針,需要做進(jìn)一步的討論和確認(rèn),但到目前為止,在ADO .NET中它們只得到有限的支持。下面開(kāi)始分析更新ADO .NET中數(shù)據(jù)源的方法和技術(shù)。本月,我將重點(diǎn)放在直接SQL命令和存儲(chǔ)過(guò)程上。在以后的專欄中,我將同時(shí)詳細(xì)介紹批更新和服務(wù)器指針。
OLE DB 和"管理"提供者
ADO .NET并不直接支持OLE DB提供者,但這并不是說(shuō)你不能從ADO .NET中訪問(wèn)OLE DB提供者。對(duì)此,我只是要表明一個(gè)特殊的管理提供者總是對(duì)訪問(wèn)任何現(xiàn)有的有效OLE DB提供的調(diào)用進(jìn)行預(yù)處理。出于這個(gè)原因,你的ADO .NET永遠(yuǎn)不會(huì)直接作為一個(gè)OLE DB客戶。
管理提供者是在。NET中工作的一種模塊,它的工作方式與OLE DB在Win32? 和 COM環(huán)境中的工作方式相同。從任何角度來(lái)說(shuō),管理提供者是OLE DB的。NET對(duì)應(yīng)物。它們是簡(jiǎn)化了的組件,并不象OLE DB那樣遵循復(fù)雜的通用的規(guī)范(如通用數(shù)據(jù)訪問(wèn))。更重要的是,管理提供者完全能在。NET的通用語(yǔ)言運(yùn)行時(shí)(Common Language Runtime ,CLR)環(huán)境中工作。相反,OLE DB提供者是一個(gè)老COM對(duì)象,在。NET環(huán)境中,它只能運(yùn)行在非管理窗口中。
為了訪問(wèn)ADO.NET中的數(shù)據(jù),你應(yīng)當(dāng)遵循典型ADO會(huì)話中的同樣步驟。首先,創(chuàng)建鏈接,通過(guò)連接字符串指定參數(shù)。接著,實(shí)例化命令對(duì)象,設(shè)置正確的命令字和行為,然后執(zhí)行。最后,根據(jù)命令的期望輸出,或者你操縱結(jié)果,或者關(guān)閉鏈接,將其余工作留給應(yīng)用程序。 注意,在ADO中可以減少一些步驟,如直接調(diào)用Connection對(duì)象的Execute方法。這種做法在ADO .NET中是不允許的,因?yàn)椴⒉皇撬蓄愋偷腃onnection對(duì)象具有Execute方法。
不同類型的鏈接對(duì)象?這又意味著什么呢?
ADO .NET要求你在鏈接時(shí)事先知道并指定將鏈接到的(管理)數(shù)據(jù)提供者的類型。在ADO中,你擁有Connection對(duì)象,這就足夠了,而不必考慮獲得和設(shè)置數(shù)據(jù)的物理通道。不論是使用OLE DB ,還是歸結(jié)為ODBC,通過(guò)供ODBC使用的通用OLE DB提供者,ADO 總是要求使用同種類型的Connection對(duì)象。在ADO .NET中情況就不是這樣了。
到目前為止,有兩種類型的管理提供者,一個(gè)專門(mén)用于SQL Server 7.0 和 2000,另一個(gè)用于訪問(wèn)任何OLE DB提供者。通過(guò)管理提供者,容易辨別出這種設(shè)計(jì)方式與在ADO中允許ODBC數(shù)據(jù)源訪問(wèn)OLE DB的方式是相同的。用于訪問(wèn)ODBC數(shù)據(jù)源的第三方管理提供者現(xiàn)在處于測(cè)試階段。事實(shí)上,用于OLE DB的管理提供者不支持ADO中用于同ODBC驅(qū)動(dòng)對(duì)話的MSDASQL OLE DB提供者。
SQL Server是在System.Data.SqlClient名稱空間中定義它的類的。OLE DB 管理提供者大部分定義在System.Data.OleDb名稱空間中。在ADO .NET中,不存在通用而又有用的鏈接類。存在一個(gè)DBConnection類,其它其它特定于提供者的鏈接類從該類派生,但它是一個(gè)抽象類。作為原形設(shè)計(jì),它是有用的,但它不會(huì)直接在應(yīng)用程序中使用。因此,為打開(kāi)一個(gè)鏈接,必須使用下面的兩個(gè)方法之一:SqlConnection 方法和 OleDbConnection方法。如果目標(biāo)是SQL Server 7.0, SQL Server 2000或更高版本,使用前者。如果目標(biāo)是OLE DB提供者,就應(yīng)當(dāng)使用后者。如果需要通過(guò)ODBC驅(qū)動(dòng)器訪問(wèn)數(shù)據(jù),就要使用ODBC .NET提供者的鏈接類(名為OdbcConnection)。
要訪問(wèn)SQL Server數(shù)據(jù)庫(kù),使用直接管理提供者將產(chǎn)生更加有效的代碼。然而,注意如果需要訪問(wèn)SQL Server6.5,那么就必須求助于OLE DB提供者,并使用OleDbXxx類和用于OLE DB的管理提供者。因此,在ADO .NET中有許多成對(duì)的類,如SqlConnection 和 OleDbConnection, SqlCommand 和 OleDbCommand, SqlDataReader 和 OleDbDataReader等等。盡管不同的對(duì)間最大的不同可能在于它的前綴,但如果說(shuō)它們對(duì)編程接口是相同的,卻是不對(duì)的。可以確定的是,每對(duì)類做同樣的事情,但它們所有的接口反映的是底層的數(shù)據(jù)提供者。例如,在SqlConnection對(duì)象上沒(méi)有Provider屬性,而在類中沒(méi)有PacketSize 或 WorkStationId 概念。
在本文的后面部分,我將使用SQL Server管理提供者,這將意味著面向數(shù)據(jù)的ADO .NET類將帶有Sql前綴。在先前否認(rèn)聲明有效的前提下,不需要對(duì)代碼進(jìn)行修改或進(jìn)行有限修改,它就能工作,對(duì)于由OLE DB提供者暴露的ADO.NET數(shù)據(jù)源也是一樣的。