利用ADO.NET命令進(jìn)行使用介紹
ADO.NET命令真正的進(jìn)步源自數(shù)據(jù)集這一概念的提出,在ADO中不存在與ADO.NET DataSet類似的對(duì)象。雖然我們無法從這個(gè)例子看出DataSet對(duì)象的重要性,但從體系結(jié)構(gòu)上說,DataSet對(duì)象處于一個(gè)不同的層次。它允許我們?cè)谕粋€(gè)邏輯對(duì)象的組織之下管理多個(gè)表,
修改數(shù)據(jù)
以脫機(jī)方式工作時(shí),我們對(duì)數(shù)據(jù)的添加、修改、刪除等更新操作在內(nèi)存緩沖中進(jìn)行。因此,如果你利用NewRow添加了新的記錄,或者利用某個(gè)簡單的工具編輯現(xiàn)有的行,這些更新只在內(nèi)存中進(jìn)行,不影響底層的數(shù)據(jù)源。更新操作在我們從Command對(duì)象調(diào)用Update方法提交更改的時(shí)候發(fā)生。Update方法為數(shù)據(jù)集中每個(gè)被插入、ADO.NET命令修改、刪除的行分別調(diào)用Insert、Update和Delete命令。
我們可以利用ADO.NET命令的InsertCommand、UpdateCommand和DeleteCommand屬性,指定面向特定數(shù)據(jù)源的命令,插入、修改或刪除記錄。這些屬性的內(nèi)容和我們所要操作的數(shù)據(jù)提供者有關(guān),但是,如果數(shù)據(jù)提供者是一個(gè)數(shù)據(jù)庫管理系統(tǒng)(DBMS),屬性的內(nèi)容很可能就是SQL命令字符串。當(dāng)Update方法執(zhí)行時(shí),如果這些屬性還沒有設(shè)置好,但DataSet對(duì)象包含了主鍵信息,那么,ADO.NET將自動(dòng)生成命令文本。#t#
我建議,只有當(dāng)應(yīng)用程序要求讀取一定數(shù)量的記錄并進(jìn)行修改,而且修改的次序和數(shù)量不可預(yù)測時(shí),才使用這種插入、更改、刪除記錄的方法。ADO.NET命令如果應(yīng)用程序的用戶界面只是要求填寫幾個(gè)字段,然后插入或更新記錄,那么,執(zhí)行SQL語句或存儲(chǔ)過程是更理想的方法。
設(shè)置了關(guān)系之后,ADO.NET將拒絕所有破壞該關(guān)系的數(shù)據(jù)集改動(dòng)操作,并產(chǎn)生一個(gè)運(yùn)行時(shí)異常。在遍歷表的記錄時(shí),調(diào)用GetChildRows方法可以從已連接的表訪問所有相關(guān)的行。GetChildRows方法返回一個(gè)DataRow對(duì)象的數(shù)組,這是一種新的分層式記錄導(dǎo)航方式,而傳統(tǒng)的記錄導(dǎo)航方式屬于順序模式或隨機(jī)模式。
關(guān)系是不可傳遞的。ADO.NET命令假設(shè)表A關(guān)聯(lián)到表B,表B又關(guān)聯(lián)到表C的一些行。另外,假設(shè)在遍歷表A記錄的時(shí)候,對(duì)于每一個(gè)表A的記錄,我們要訪問現(xiàn)有關(guān)系中的子記錄。如果我們想要訪問對(duì)應(yīng)表B中特定記錄的表C記錄,那么,我們不能使用由A-B的關(guān)系得到的表B的ADO.NET命令;相反,我們必須從表B打開一個(gè)新的表視圖,找到我們想要的特定記錄,然后通過表B對(duì)表C的關(guān)系調(diào)用GetChildRows方法。