探秘ADO.NET 應(yīng)用程序種種新特性
對(duì)于現(xiàn)在使用ADO.NET 應(yīng)用程序說(shuō)明,這里只提及了ADO.NET 應(yīng)用程序的相關(guān)使用,但這些提及的內(nèi)容都明確表明了 ADO 批處理更新實(shí)現(xiàn)和 ADO.NET 批處理更新實(shí)現(xiàn)之間的一個(gè)重要區(qū)別。
ADO.NET 應(yīng)用程序和基礎(chǔ)數(shù)據(jù)源之間的交互基于一個(gè)具有雙向信道的雙體系結(jié)構(gòu)。您可以使用各個(gè)特定于提供程序的命令或批處理更新過(guò)程來(lái)訪問(wèn)數(shù)據(jù)源,以讀取和寫入行。在這兩種情況下,數(shù)據(jù)訪問(wèn)都會(huì)產(chǎn)生完全雙向綁定,并涉及各種不同的對(duì)象和方法。
您可以使用如 SqlCommand 和 OleDbCommand 等命令類來(lái)執(zhí)行單個(gè)命令。可使用數(shù)據(jù)適配器對(duì)象來(lái)下載斷開連接的數(shù)據(jù),提交更新的行集。雖然 “數(shù)據(jù)集” 是數(shù)據(jù)適配器用于返回和提交記錄塊的容器對(duì)象,但各個(gè)命令通過(guò)數(shù)據(jù)讀取器對(duì)象返回?cái)?shù)據(jù)。
更新是通過(guò)各個(gè)命令、存儲(chǔ)過(guò)程完成的,通常,托管提供程序理解的任何命令文本一般都被稱為更新。ADO.NET 應(yīng)用程序更新命令總是執(zhí)行嵌入在語(yǔ)句正文中的新數(shù)據(jù)。更新命令總是需要一個(gè)打開的連接,可能還需要一個(gè)正在進(jìn)行的事務(wù)處理或一個(gè)新的事務(wù)處理。
批處理更新則是一個(gè)略有不同的方法分支。從最高的抽象級(jí)別來(lái)看,您并不發(fā)出命令,無(wú)論它可能有多么復(fù)雜。取而代之的是,您提交在客戶端修改的當(dāng)前行的快照,并等待數(shù)據(jù)源批準(zhǔn)。批處理更新背后的關(guān)鍵概念是數(shù)據(jù)斷開連接的概念。
您下載行表,通常為數(shù)據(jù)集,根據(jù)需要在客戶端對(duì)它進(jìn)行修改,然后將這些行的新映像提交到數(shù)據(jù)庫(kù)服務(wù)器。ADO.NET 應(yīng)用程序您所作的是提交更改,而不是執(zhí)行一個(gè)對(duì)數(shù)據(jù)源創(chuàng)建更改的命令。這就是更新(我在 July column 一文中討論過(guò)這個(gè)問(wèn)題)和批處理更新之間的本質(zhì)區(qū)別。
在進(jìn)一步詳細(xì)討論 ADO.NET 應(yīng)用程序 批處理更新之前,我需要闡明常常會(huì)導(dǎo)致某種誤解的批處理更新模型的一個(gè)方面。雖然更新和批處理更新在 ADO.NET 內(nèi)的實(shí)際實(shí)現(xiàn)方面有著本質(zhì)的區(qū)別,但它們遵循的是同一個(gè)更新模型。更新和批處理更新都是通過(guò)直接的并且特定于提供程序的語(yǔ)句來(lái)完成的。當(dāng)然,由于批處理更新通常涉及到更多的行,所以這些語(yǔ)句會(huì)被組合為一個(gè)批處理調(diào)用。#t#
批處理更新會(huì)對(duì)目標(biāo)數(shù)據(jù)集的行進(jìn)行從頭到尾的循環(huán),只要發(fā)現(xiàn)更新的行,ADO.NET 應(yīng)用程序就會(huì)發(fā)出適當(dāng)?shù)母旅睿↖NSERT、DELETE 或 UPDATE)。對(duì)更新的行進(jìn)行通信時(shí),將運(yùn)行一個(gè)預(yù)定義的直接 SQL 命令。從本質(zhì)上來(lái)說(shuō),這就是批處理更新。
這個(gè)過(guò)程是理所當(dāng)然的。實(shí)際上,如果批處理更新使用完全不同的更新模型,就需要來(lái)自數(shù)據(jù)源的特殊支持。(這正是向 SQL Server 2000 提交 XML updategram 時(shí)發(fā)生的情況。)批處理更新只是一個(gè)用來(lái)簡(jiǎn)化多個(gè)行更新提交的客戶端提供的軟件機(jī)制。在任何情況下,ADO.NET 應(yīng)用程序每個(gè)新行提交總是通過(guò)數(shù)據(jù)源直接命令的正常通道完成的。