.net 中的數(shù)據(jù)訪問 讀取數(shù)據(jù) dataset、datatable 和 recordset 轉(zhuǎn)換現(xiàn)有代碼 更新數(shù)據(jù) xml 擴(kuò)展支持 總結(jié) 自若干年前推出開放式數(shù)據(jù)庫連接 (odbc) 應(yīng)用程序編程接口 (api) 以來,出現(xiàn)了各種各樣的數(shù)據(jù)庫訪問技術(shù),而 ado.net 是其中最新的一種。在這過程中,發(fā)生了許多有趣的事。例如,com 闖入數(shù)據(jù)庫領(lǐng)域,開始培植 ole db 的殖民進(jìn)程。然后,大致相當(dāng)于 ole db 自動(dòng)化版本的 activex® data objects (ado) 被選來統(tǒng)治 windows® 數(shù)據(jù)庫開發(fā)者的 visual basic® 和 asp 社區(qū)。 通過 .net,microsoft 正在提供通用框架(即 framework class library),其中將包括所有現(xiàn)有的 windows api 甚至更多的內(nèi)容。特別值得一提的是,它包括大量常用的庫,而這些庫現(xiàn)在需要通過各個(gè) com 對象分別獲得。在這些庫中,您會(huì)發(fā)現(xiàn) xml 和 ado 對象模型,它們被集成到了叫做 ado.net 的類子樹中。 ado.net 事實(shí)上成為構(gòu)建數(shù)據(jù)感知 .net 應(yīng)用程序的基礎(chǔ)。和 ado 不同的是,ado.net 遵循更通用的原則,不那么專門面向數(shù)據(jù)庫。ado.net 集合了所有允許數(shù)據(jù)處理的類。這些類表示具有典型數(shù)據(jù)庫功能(如索引、排序和視圖)的數(shù)據(jù)容器對象。盡管 ado.net 是 .net 數(shù)據(jù)庫應(yīng)用程序的權(quán)威解決方案,但從總體設(shè)計(jì)上來看,它不象 ado 模型那樣以數(shù)據(jù)庫為中心,這是 ado.net 的一大特點(diǎn)。 ado.net 與 ado 有很大差異。ado.net 是新的數(shù)據(jù)訪問編程模型,需要開發(fā)人員的全面理解、投入和新思維。然而,一旦開始掌握 ado.net,您將意識(shí)到:原有的 ado 技巧非常有助于您以不同、卻更巧妙和可靠的方式來創(chuàng)建有效的應(yīng)用程序和解決各種老問題。 在這篇文章的其余部分,我將集中介紹如何以 ado.net 方式實(shí)現(xiàn)基本的數(shù)據(jù)庫操作。我想說明,在什么時(shí)候 ado.net 是比 ado 更好的選擇,而您最好在什么時(shí)候應(yīng)放棄 ado。ado.net 并不是將 ado 改良以符合 .net 基礎(chǔ)結(jié)構(gòu)而形成的。只要您看一下 ado.net 的語法、代碼設(shè)計(jì)和移植,就會(huì)明白這一點(diǎn)。
.net 中的數(shù)據(jù)訪問
在 ado.net 中訪問數(shù)據(jù)源的方式由托管提供程序確定。從功能上講,托管提供程序與 ole db 的提供程序非常相似,但有兩個(gè)重要的不同之處。首先,管理提供程序在 .net 環(huán)境中工作,通過 datareader 和 datatable 等 .net 類檢索和公開數(shù)據(jù)。其次,因?yàn)樗鼈兊捏w系結(jié)構(gòu)針對 .net 進(jìn)行了優(yōu)化,所以比較簡單。 目前 ado.net 提供了兩種托管提供程序:一種用于 sql server™ 7.0 或更高版本,另一種用于其他所有您可能已經(jīng)安裝的 ole db 提供程序。在這兩種情況下您分別使用不同的類,但遵循相似的命名規(guī)則。除前綴外,名稱都是相同的。前一種情況前綴為 sql,后一種情況則是 ado。 您應(yīng)該使用 sql 類訪問 sql server 表,因?yàn)樗鼈冎苯舆M(jìn)入數(shù)據(jù)庫服務(wù)器的內(nèi)部 api,跳過了由 ole db 提供程序表示的中間層。ado 類是 ole db 提供程序上的 .net 接口,它們使用 com interop 橋進(jìn)行工作。 ado.net 對象的初學(xué)者可參閱 omri gazitt 的文章介紹 ado+:用于 microsoft .net 框架的數(shù)據(jù)訪問服務(wù)(英文)和我的 ado+ 推動(dòng)數(shù)據(jù)種類的演變(英文)一文。前者技術(shù)性較強(qiáng),針對 ado.net 程序模型提供了高水平的評注性概述。后者主要介紹 ado.net 的目標(biāo)和它與 xml、腳本以及其他技術(shù)之間的聯(lián)系。
讀取數(shù)據(jù)
需要從數(shù)據(jù)源中讀取數(shù)據(jù)的 ado.net 應(yīng)用程序首先要?jiǎng)?chuàng)建連接對象。根據(jù)目標(biāo)提供程序的不同,該連接對象可以是 sqlconnection 或 adoconnection。請記住,您可以使用 ado.net 類來連接到 sql server 數(shù)據(jù)庫,但我們不建議這樣做。其唯一的缺點(diǎn)是,您的代碼要通過不必要的額外代碼層。它先將 ado 的托管提供程序調(diào)入,然后托管提供程序再調(diào)用 sql server ole db 提供程序。而 sql server 托管提供程序和 ole db 提供程序一樣直接操作數(shù)據(jù)。 ado 和 ado.net 連接對象之間的顯著差異是:ado.net 連接不支持 cursorlocation 屬性。請注意,這并不是一個(gè)文檔錯(cuò)誤,而是一個(gè)有爭議的設(shè)計(jì)問題。為了突出以數(shù)據(jù)為中心的原則,ado.net 沒有游標(biāo)的顯式實(shí)現(xiàn)。 在 ado 中,您習(xí)慣了用游標(biāo)從數(shù)據(jù)庫或其他任何 ole db 兼容的數(shù)據(jù)源中抽取記錄。您可以選擇客戶端或服務(wù)器游標(biāo),每種游標(biāo)都有幾個(gè)預(yù)先設(shè)定的游標(biāo)類型。ado.net 則設(shè)計(jì)為從數(shù)據(jù)源中抽取數(shù)據(jù),并提供新的編程接口來讀取和分析數(shù)據(jù)。 在 ado 中,您通過指定連接和命令文本來創(chuàng)建 recordset 對象。對于游標(biāo)的位置和類型,recordset 有一定策略。您可以按下列方式之一讀取數(shù)據(jù):