ADO.NET深入研究(1)[特別推薦]
2024-07-10 13:03:38
供稿:網友
導 讀:.net 在數據存取方面做了很大的調整。在.net 框架下,數據存取是由ado.net來完成的,這是一個ado的改進和完善版本。它最顯著的變化是其完全基于xml。而對于從事ado開發的人員來說,recordset對象的消失也令他們感到驚奇。
--------------------------------------------------------------------------------
翻譯整理:.net技術網(www.51dotnet.com)slash
原文出處:http://www.dnjonline.com/articles/essentials/iss22_essentials.html
.net 在數據存取方面做了很大的調整。在.net 框架下,數據存取是由ado.net來完成的,這是一個ado的改進和完善版本。它最顯著的變化是其完全基于xml。而對于從事ado開發的人員來說,recordset對象的消失也令他們感到驚奇。
微軟對recordset 對象的看法是:它相對于最初的為了產生一個sql查詢的結果的機制,顯得有些過于臃腫了。因此,在ado.net中,recordset對象的功能將被拆分到三個部分中去。首先是datareader對象, 它所要完成的功能是將數據簡單的表現出來;在ado中,類似功能是由向前的、服務器端的光標(forward-only, server-side cursor)來實現的。然后是dataset 和 datasetcommand 對象,它們能夠在客戶端創建一個或一個以上的數據集合的緩存,并對它們進行操作。在ado中,客戶端光標的使用相對比較單一化,而在這方面ado.net則分別賦予這兩個對象不同的功能,從而使它們具有更加專一而強大的功能。最后,是其他一些在ado中能夠實現的功能,比如說,利用connection對象在保守鎖定的情況下進行數據的更新。這是在ado.net中無法實現的功能,這意味著在某些時候,ado將被繼續使用。
在進入dataset的討論之前,我們先來簡單的來看一看ado.net。
使用datareader
ado.net提供了三個類:dbconnection, dbcommand 和 dbdatareader,它們與傳統的ado對象十分的相似。但是在.net應用程序中它們不能被直接使用。能夠使用的是從它們繼承而來的類,比如adoconnection, adocommand 和 adodatareader來讀取數據,這里的前提是存在一個oledb的provider。如果要操作的對象是sql server,那么將使用另一些功能相同的類sqlconnection, sqlcommand 和 sqldatareader 以便直接通過sql server 的 tds 連接通道來獲得更好的工作性能。下面是一個例子(因為在這里c#和vb.net的代碼區別不是很大,所以將只使用vb.net的實例):
imports system.data
imports system.data.ado
..
dim cn as new adoconnection()
cn.connectionstring = strconnect
try
cn.open()
dim cd as new adocommand(搒elect * from authors? cn)
dim dr as adodatareader
cd.execute(dr)
while dr.read()
listbox1.items.add(dr(揳u_lname?)
end while
catch err as exception
msgbox(err.tostring)
finally
if cn.state = dbobjectstate.open then cn.close()
end try
在上面你會發現在while loop語句中沒有出現movenext方法,因為datareader的read方法將自動前移光標,并會在沒有數據的時候返回一個false值。這顯然減輕了開發者的工作量。
在兩種情況下,datareader被推薦使用:一、客戶界面利用手寫代碼,或是沒有用到數據綁定并且數據的更新是利用手寫的sql語句或是存儲過程,這種情況下,datareader將提供有效的訪問相關數據的方法;二、一個需要查看數據庫狀態的的過程,但不需要實現諸如自動更新的功能。一些比較好的應用實例有向下拉菜單填充數據,以及產品編號的驗證。
理解datasets
對于一些開發者來說,可能會對datasets的使用頗有微詞,但事實上,掌握它并不難。如果你對連接斷開的recordset 模式,以及分層的recordset 的使用不陌生,并且樂于使用一些xml的話,那么利用datasets 就沒有什么困難了。
可是有什么必要去花費時間去重新學習一種對象模型呢?
理由之一是,ado.net 力推的斷開連接模式(disconnected model)是非常有意義的。斷開連接的數據伸縮性更高,因為這種模式對數據服務器的壓力比較小。通過平行服務器對中間層進行擴展比對數據層進行擴展要容易的多,因此對于可擴展的應用程序來說,對數據層資源的使用要謹慎。斷開連接模式將在這里得到應用。
理由二,在數據管理方面,斷開連接模式有非常廣闊的前景。
如果說有一種技術的 發展比ado還要迅速,這就是xml。xml解決了兩個ado所對的局限。
1、xml更加適用與跨平臺的的數據傳輸,因為它能夠穿越防火墻。
2、xml比ado包括它的擴展ado2.5描述的類型多。一個簡單的例子,同樣面對扁平的數據,普通的xml將比ado顯示出更高的效率。
datasets是xml與ado結合的產物,它的一個重要的特點是與數據庫或sql無關。它只是簡單的對數據表進行操作,交換數據或是將數據綁定到用戶界面上。
向datasets中加入數據表的方法有兩種:
1、利用datasetcommand對象,它可以以xml 的形式返回一個數據庫查詢的結果。在處理數據庫更新的時候,這種方法與ado的客戶端光標基本相同,但提供更強的控制。
2、直接對xml數據進行操作。dataset 對象有對xml數據和schemas進行讀寫的的方法,并且可以和xmldatadocument對象(該對象是多用途xmldocument類的繼承)緊密的結合起來工作,它具有一些對扁平數據操作的特殊函數因此可以作為從dataset 到通用xml dom的橋梁。
下面是一段使用dataset的代碼:
dim dc as new adodatasetcommand( _
"select au_id, au_fname, au_lname from authors" & _
" where au_lname = ‘ringer’", strconnect)
dim ds as new dataset()
dc.filldataset(ds, "authors")
msgbox(ds.xmlschema, , "xml schema")
msgbox(ds.xmldata, , "xml data")
以上的代碼將一個‘authors’數據表填充到dataset 對象實例 ds 中,并顯示了xml數據和schemas,請看兩個顯示結果:表1 和 表2
向dataset中添加數據表的操作是非常容易的,請看下面的代碼:
dc = new adodatasetcommand( _
"select * from titleauthor" & _
" where title_id like 'ps%'", strconnect)
dc.filldataset(ds, "titles")
msgbox(ds.xmldata, , "xml data")
表1顯示xml schema
表2顯示dataset 對象生成的數據
未 完 待 續