ADO.NET深入研究(2)[精選]

來源:互聯網
上載者:User
ado 導 讀:.NET 在資料存取方面做了很大的調整。在.NET 架構下,資料存取是由ADO.NET來完成的,這是一個ADO的改進和完善版本。它最顯著的變化是其完全基於XML。而對於從事ADO開發的人員來說,Recordset對象的消失也令他們感到驚奇。
--------------------------------------------------------------------------------

翻譯整理:.net技術網(www.51dotnet.com)slash
原文出處:http://www.dnjonline.com/articles/essentials/iss22_essentials.html

表4顯示了DataSet 中現有的資料。可以發現現在有兩種資料類型,同時SCHEMA 也做了相應的調整來描述這兩種資料類型。

請注意我們現在並沒有做建立一個內串連或外串連,而是類似於用SHAPE 語言用兩個單獨的表建立了一個分級的Recordset對象。當然你也可以建立串連,這在DataSet中表現為一個表。

ADO開發人員在操作Recordset 對象的時候,需要知道他們到底需要一個用戶端還是伺服器端的游標。MoveFirst 或是 AbsolutePosition之類的操作,在伺服器端游標的情況下將消耗很大的伺服器資源,但在用戶端游標的情況下,確是高效和有力的工具。兩類游標存在著巨大的差異。一個用戶端游標的Recordset 對象事實上更類似於一個高效能的數組,而不是一一種序列化的存取結構。

與之相對,DataSet 始終是'用戶端的',並且可以發揮'高效能數組'存模數型的最高效率。在Recordset 中有欄位集合,但對於一個Recordset 對象,卻沒有相應的集合。而DataSet中的所有表都有一個列和一個行的集合,你可以使用簡單的隨機存取技術來操作它們,表5顯示了在ADO.NET 中操作DataSet的物件模型。

通過迴圈的方式你可以對DataTable中的每一行進行操作,然而我在下一個例子中採用了另一種方法:DataTable 的 Select 方法。這是一個重載方法,從本質上來說,它相當於結合了Recordset的FILTER 和 SORT 屬性。SELECT 方法返回一個以DataRow對象為元素的數組--能夠利用標準的數組的方法對它處理。需要注意的是所有這些過程是在你程式的緩衝中進行的,DataSet 已經和資料來源完全的斷開了。

下面的範例程式碼向DataSet中填充兩個資料表(第二個表沒有使用 WHERE 子句)然後用SELECT 方法從'Authors'返回一個數組,並利用該結果建立一個動態下拉式清單。

Dim dc As New ADODataSetCommand( _
"select au_id, au_fname," & _
" au_lname from authors", strConnect)
Dim ds As New DataSet()

' Declare an array of DataRows
Dim dr() As DataRow
Dim i As Integer

dc.FillDataSet(ds, "Authors")
dc = New ADODataSetCommand( _
"select * from titleauthor", strConnect)
dc.FillDataSet(ds, "Titles")

dr = ds.Tables("Authors").Select( _
"au_lname >= 'R'", "au_lname ASC")

For i = 0 To UBound(dr)
listbox1.Items.Add( _
CStr(dr(i)("au_fname")) & " " _
& CStr(dr(i)("au_lname")))
Next

在這裡,SELECT 語句返回所有的行,其中的 last name 的打頭字母在 'R'之前,並且對這些行進行了分類,'Titles'表在這裡被忽略了

表之間的聯絡

如果你沒有利用SHAPE LANGUAGE 進行過工作,你很可能只是建立一個擁有一個資料表的 DataSet 並對其進行操作,就象Recordset 對象一樣。當你一旦向DataSet 中加入了多個表,你會希望在它們之間建立關聯以便於操作。在下面的代碼中,假定以與上例完全相同的方法建立了一個名為DS的DataSet 對象:

Dim dr() As DataRow
Dim drChildren() As DataRow
Dim dl As DataRelation
Dim i, j As Integer

dl = New DataRelation("AuthorTitles", _
ds.Tables("Authors").Columns("au_id"), _
ds.Tables("Titles").Columns("au_id"))
ds.Relations.Add(dl)

dr = ds.Tables("Authors").Select( _
"au_lname >= 'R'", "au_lname ASC")

For i = 0 To UBound(dr)
listbox1.Items.Add( _
CStr(dr(i)("au_fname")) & " " _
& CStr(dr(i)("au_lname")))
drChildren = dr(i).GetChildRows(dl)
For j = 0 To UBound(drChildren)
listbox1.Items.Add(" " & _
CStr(drChildren(j)("title_id")))
Next
Next

DataSetCommands


表 6:
使用list box顯示兩個表的一多關係

這段代碼在'Authors' 表和 'Titles'表之間建立了一個父子關係的關聯,這是通過建立一個DataRelation對象(命名為dl)並將它加入DataSet實現的。關聯指定 au_id 為關鍵字段,通過對子表('Titles')中 au_id 的匹配來得到父表中每一行的子行。在ADO 資料篩選的SHAPE 語言中是,這是通過 RELATE 語句來實現的。

當你指定了父表中的行時,你可以利用這種關聯。你可以通過GetChildRows方法得到所有子表中所有相關的行,當然這裡的關聯關係是由你來決定的。DataRelations 使得建立一個master-detail程式變的非常簡單。上面的代碼的顯示結果見表6。

下面我們來瞭解一下ADODataSetCommand對象以及與它功能相似的SQLDataSetCommand對象。我們已經瞭解了它們三個主要功能中的一個,就是通過使用命令字串和一個串連號向DataSet 對象中加入資料。下面對另外兩個主要功能進行討論,首先是更新(updating)。

在傳統的ADO中,一個用戶端的 Recordset 對象通過SQL 陳述式來進行更新。在這裡SQL 類比開放式鎖定,因此更新得以被返回到資料庫。這是一個靈活的機制,但有兩個缺點:一、自動產生的SQL語句不易更改,因此假如你寫一些高效率的預存程序,將會比直接使用SQL 陳述式迅速的多。二、這是第一個問題的延續。當需要更新的資料來源無法理解ANSI-SQL的時候,你就無法使用用戶端的Recordset了。象Active Directory, Exchange 2000以及 Indexing Services這些相容ADO 的資料來源,它們不相容ANSI 的標準。因此你如果想通過ADO對它們進行更新,你就只能使用伺服器端的游標了。

在ADO.NET 中這些問題被解決了。第一種方法,DataSet 與資料來源完全斷開,ADODataSetCommand作為一個獨立的實體與資料來源進行互動。更新完全由ADODataSetCommand進行,而DataSet則被完全隔離。

第二中方法,ADODataSetCommand將更新的SQL語句作為一種公開的屬性,這樣你可以輕鬆的替換SQL 陳述式,或者是預存程序。更為出色的是,如果你想使用預存程序,Visual Studio.NET 將為你產生,在下一部分我們可以看到具體的應用。

最後是關於資料表映射功能。資料的使用者不需要得到這樣一個資料表:列以'au_fname' 和 'au_lname'命名。不僅是不美觀的問題,更重要的是這樣會把資料庫的結構暴露出來了,資料對應允許你在DataSet 中替換列的名字,如果需要,可以為不同的使用者提供不同的資料表映射,下面我將介紹如何利用Visual Studio.NET ,在圖形化的介面下建立資料更新的代碼。

簡單的可視化設計

Visual Studio.NET 為 Windows Forms, Web Forms, Web Services, Components and XML Schemas的設計提供了圖形化的設計工具。設計者只需要從工具條上的控制項拖動到工作區域 就可以了。在這裡,工作區域將與終端使用者看到的介面有很大區別。

當你將一個非可視的對象如ADODataSetCommand拖動進來時,它將被顯示在設計檢視中,但使用者將無法看到這個對象。其他的資料控制項也是這樣。

表7顯示了一個VB.NET的項目,這個項目有一個表單,上面有一個DataGrid控制項、一個CommandButton以及ADODataSetCommand控制項,在這裡你可以象在Visual Studio 6中一樣來處理ADODataSetCommand:在可視化的介面中你可以利用嚮導來建立ADODataSetCommand的連接字串,命令字串;在與資料庫的介面上,你可以選擇自動產生SQL語句,選擇已有的預存程序,或是建立一個新的預存程序。

表8顯示了嚮導的最終結果,你可以給你建立的預存程序命名,或者只是預覽一下,然後將之存為檔案以便以後修改。

如果你不想利用預存程序,你也可以直接使用SQL語句,你還可以在屬性面板上修改這些語句。你還可以做的工作包括給對列進行簡單化的命名,以便你今後能夠方便的使用。具體的操作可以參看錶9的對話方塊。

在完成了以上的工作後,應用程式的編寫變的相對很輕鬆了,下面是DATAGRID的綁定的代碼:

Me.ADODataSetCommand1.FillDataSet(dsAuthors)
Me.DataGrid1.DataSource = dsauthors

ADODataSetCommand1成為表單Me的一個屬性,它將dsAuthors表裝入一個DataSet 對象,接著設定DataGrid的DataSource屬性為dsAuthors。最後是編寫CommandButton的CLICK 事件:

Me.ADODataSetCommand1.Update(dsAuthors)

UPDATE 事件將根據對dsAuthors的修改對資料來源進行更新(具體的UPDATE 方法在預存程序中已經被設定)。這與ADO 中中斷連線的RecordsetS對象的批次更新很相似,但效率更高。可以在表10中看到最終完成的應用程式,它的列名已經被替換為新的列名。


表10: 運行結果

類型化的DataSet

對於許多開發人員來說,他們已經習慣了使用ADO 的 Recordset 對象的,象使用欄位(fields)而不是使用屬性(properties),這樣做有它的優勢,但也有很多缺陷。首先,與屬性不同,欄位並不是強型別的,它不為IntelliSense技術(自動提醒文法、參數和對象屬性)所支援。另外,因為不是強型別,所以你無法為它添加自訂的方法或是屬性,這意味著當你需要把一個Recordset 對象的功能完全封裝起來的時候,你會遇到許多限制。

與之相對,因為.NET 平台支援繼承,所以你可以建立DataSet 對象的子類,並向其中添加新的功能。這就是具有類型的 DataSet,它基本上沒有什麼使用範圍的限制,所有DataSet 在.NET 中內建的特性都將被支援,包括綁定,和XML DOM 的內部操作。為了建立這樣一個具有類型的 DataSet 對象,你所需要的只是一個XSD 格式的 XML SCHEMA。

當你基於一個DataSetCommand 上建立具有類型的 DataSet 的時候,你甚至可以讓Visual Studio.NET 來建立這樣一個 XML SCHEMA,所有的工作只是滑鼠在'Generate DataSet'菜單上的輕輕一點(見表7)。在這裡使用的XML SCHEMA與表2中的是一樣的(除非你對資料表的結構做了改動)

在後面的例子中我將使用我建立的具有類型的AuthorsDataSet 對象來代替DataSet 對象。AuthorsDataSet中的所有表和列都將是它的屬性,因此所寫出的代碼將更易於查看,而強型別將更不易出錯,同時還可以利用IntelliSense技術。表11顯示了類型化的DataSet 的編程介面,注意IntelliSense菜單也被顯示出來了。



表11中我們可以看到在AuthorsDataSet被建立之後,同時還建立了authorsSelectTable(繼承於DataTable),authorsSelectRow(繼承於DataRow),以及所有的列的類(繼承於DataColumn),由此,我們可以看到繼承對.NET 的重要意義。

FindByAuthor_ID方法自動被添加到authorsSelectTable類中,列屬性被自動添加到authorsSelectRow類中,所有的類的代碼都是非隱藏的而且易於擴充。如果你已經習慣了使用中斷連線的(disconnected)或是虛擬(fabricated)Recordset 對象,那麼轉向ADO.NET 使用具有類型的 DataSet 對象是一個很好的選擇。

ADO 到 ADO.NET 是一個革命性的發展,在所有的.NET Framework領域中,許多基本的組件可以被重寫,因為不用受到二進位相容性的強制性約束所以可以對所有類型的組件的介面進行重寫和改善,而ADO.NET 只是其中一例。

在經過了幾個星期的使用後,我認為 ADO.NET 與ADO 相比是一個更完善的模型,我非常滿意它對ADO所做的改進。雖然某種程度上講,對於開發人員來說,需要學習一種新的物件模型,但我仍建議開發人員向.NET轉移。ADO.NET 繼承了ADO的優良特性,並且更便於使用。


相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。