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