国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

ADO.NET入門

2024-07-10 13:11:33
字體:
來源:轉載
供稿:網友

本文主要討論了作為實現基本數據庫操作方法之一的ado.net,以及ado.net與ado的基本比較

ado.net將成為構建數據感知.net應用程序的基礎.不同于ado的是,ado.net更具有通用性,不是那么專門針對數據庫而進行的設計.ado.net聚集了所有可以進行數據處理的類.這些類呈現了具有典型數據庫功能的datacontainerobjects,比如:索引,排序,瀏覽.盡管ado.net是作為重要的.net數據庫應用程序的解決方案,它更多的顯示了涵蓋全面的設計,而不僅是作為和ado模型一樣的以數據庫為中心。.

ado.net與ado有很大的不同.它是一個全新的訪問編程模型.當你開始使用ado.net時,你會發現你所掌握的任何關于ado的技能在搭建有效的程序以及解決難題方面對你都會有很大幫助,能夠幫你在解決問題上朝更靈活更穩妥的方向發展.

ado.net不是ado為適應.net基礎構造而進行改進的版本.當你慢慢了解了ado.net的語法,代碼設計以及移植后,你就會清楚了.

1.net中的數據訪問

訪問ado.net中的數據源是由托管提供程序所控制.雖然托管提供程序與oledb有兩處重大的不同,但是二者是極為類似的.首先,托管提供程序在.net環境下運行,通過datareader和datatable.net類來檢索和展示數據.第二,它們的體系結構都比較簡單,是因為為了適應.net而進行了優化.

此時,ado.net分成兩種不同類型的托管提供程序:一種用于sqlserver?7.0或更高版本,另一種適用于所有你可能已經安裝的oledb提供程序.雖然運用在兩種托管提供程序中的類是不同的,但它們卻都遵循相類似的命名方式.除開前綴之外,其它名稱都是相同的.前一種情況前綴為sql,后一種則是ado.

你需要利用sql類來訪問sqlserver表,因為sql類會跳過由oledb提供程序呈現的中間層,而直接進入數據庫服務器內部api.ado類是位于oledb提供程序頂端的.net接口,利用cominterop橋來進行工作.

關于ado.net的入門知識,你可以讀讀omrigazitt's的文章,文章里主要介紹了ado+:

關于微軟..net框架的數據庫訪問服務(dataaccessservices),而我的文章里關于ado+的論述主要指出了數據種類的進化.前者更純技術化,并提供了更高水平的關于ado.net編程模型的概述。后者主要是解釋ado.netr的目標,以及它與xml,腳本及其它技術的聯系.

2.讀取數據

ado.net應用程序要從數據源里讀取數據,首先得創建一個連接對象.這個連接對象可以是sqlconnection或是adoconnection,這取決于所采用的目標提供程序.需要記住的是,雖然在這里不做推薦,但你也可以利用ado.net類來連接到sqlserver數據庫.這種方法唯一不足是,代碼需要通過一個不必要的額外代碼層.首先它會調入ado的托管提供程序,然后ado的托管提供程序再調用sqlserveroledb提供程序.如同oledb提供程序做的一樣,sqlserver托管提供程序會直接操作數據,

關于ado和ado.net在連接對象上最大的差別在于ado.net連接不支持cursorlocation屬性.與其說這是一個文檔bug,還不如認為這是一個備具爭議的設計問題.為強制執行它的以數據為中心的基準,ado.net沒有游標的顯示實現.

在ado中,你已習慣于利用游標將記錄從數據庫或其它oledb兼容的數據源中抽取,你可以選擇客戶端或是服務器端游標,每種游標都有幾個預先設定的游標類型.而在ado.net中更多的是從數據源中抽取數據,并且為讀取和分析數據提供新的編程接口

在ado中,通過規定連接和命令文本,你可以創建一個recordset對象.對于游標的位置和類型recordset有一些規定.你可以按下面的方法來讀取數據.

在內存中創建選定記錄的靜態副本,然后在斷開與數據源的連接時對副本進行處理,ado稱之為靜態游標.

通過快速的,僅向前的,只讀游標來滾動數據,,ado稱之為僅向前游標.

通過服務器端游標來訪問數據,需要良好的連接,但您可以在不同層面上檢測由其它連線用戶輸入的信息,ado稱之為:動態游標.

頭兩種都是在斷開的recordsets上進行操作,并從客戶端緩存中讀取信息,另外,前兩種方式也常被用于面向web的環境中以及全新的n-tier系統當中.

在ado中,以上所有這些方式與不同類型的游標相對應.在文中,你將會發現,ado.net雖然與ado不同,但它具備了ado的所有功能.相對照來說,你的代碼將從實際的數據源及其物理存儲媒介和格式中抽取數據.

ado.net能夠使dataset和datareader將數據從數據源中抽取出來.前者是記錄在內存中的緩存,你可以從任意方向訪問并隨意作出修改.后者是高度優化的對象,在只讀紀錄集中以僅向前方式向前移動。注:dataset看起來象是靜態游標,但實際上,在.net中,與ado只讀游標相對應的是datareader對象.

在ado.net中,雖然對于服務器端的游標不提供任何支持,但這不意味著你就不能使用游標.實際上,你所需要做的步驟是在.net中輸入ado庫.你只需在referencesnode上單擊右鍵,就可以在你自己的程序里運行本地ado對象.

但是我個人認為,在你想轉向.net時,請慎重考慮.首先,請務必完全輸入ado,這不會花費太多時間和精力,這是向.net邁出的第一步,.但是,這僅僅是萬里長征的第一步而且也是通向.net必須的一步..net的真正附加值是基于一個均勻的,持續穩定的接口以及本地classes的廣為應用之上的.關于comlibraries是可以被支持的,合理的,但不被鼓勵的,因為它僅僅是個短期解決方案,或者是一個過渡步驟.

當你要開始使用ado.net時,請考慮這樣一個事實:ado.net統一了數據容器類編程接口,.因此,不管是何種類型的程序:windowsform,webform,或者webservice也好,你都得在同一組類中集中處理有關數據.不管處于后端的數據源是sqlserverdatabase,或是oledb提供程序,,xml文件,又或是數組,你都可以使用一樣的方法和屬性來進行處理.

如果你堅持在.net世界中使用ado,那么請準備好面對一些其它的影響,例如你需要額外的代碼才能夠從數據綁定控件中使用recordset.

3.dataset,datatable,andrecordset

關于recordsetobject.,ado.net并沒有與其直接相對應的對象.最接近的是datatable對象.雖然它們二者幾乎具有相同的功能,但它們在各自的框架里發揮著不同的作用.

recordset是一個相當大的對象,具備ado的大多數功能,但在某些方面仍有欠缺.recordset在一些方面性能優良,如:它具可創造性,它可以離線操作,功能眾多,但在一些方面仍需改進,如:基于其固有的com特性,recordset很難在網絡上連載;recordset是一個二進制的對象,因此不同平臺之間的模塊很難共享它;還有就是蛇不能夠穿過防火墻.另外,它表現的是記錄的單個表.如果該table作為一個或幾個join的結果,那么它很難更新原始代碼源.當你試圖將脫線的recordset與原始代碼源統一起來時,數據源必須能夠識別sql.不管如何,你的recordset可以由非sql提供程序創建.

在ado.net中,adorecordset的所有功能被分拆成幾塊更簡單的對象:其中一個便是datareader.datareader模擬了快速,只讀,僅向前的只讀游標的操作.

datatable,表現了數據源,是個簡單的對象.你可以手動構造一個datatable,或者也可使用dataset命令自動生成.dataset對于它所包含的數據知之不多.通過它,你可以在內存中處理數據,或者是其它比如排序,編輯,篩選,創建瀏覽等工作.

dataset對象是一個數據容器類,是實現ado.net數據抽取的關鍵對象.dataset集合了一個或幾個datatable對象.datatable通過如行,列這樣的通用集合,公開自身的內容.當你嘗試從數據表讀取數據時,你也許正穿過了兩個不同的層面:datatablemapping和dataview.

datatablemapping對象包含了數據源中的數據列,以及datatableobject之間的映射關系.

當填充dataset時,datasetcommand對象要使用這個類。它維護數據集中的抽象列和數據源中的物理列之間的鏈接。

表的視圖通過dataview對象實現。它表示datatable的自定義視圖,可以綁定到特定控件(如windows窗體和web窗體中的數據網格)中。該對象相當于sqlcreateview語句在內存中的實現。

dataset中所有的表,通過一個公共的域,相互之間能產生關聯.它們之間的聯系是由datarelation對象來進行管理.這樣說起來挺象ado的數據形成,但還是有一個最大的不同.

在datarelation里,你不需要使用數據形成語言,而且還可以獲得非常靈活的組織架構.通過ado.net導航模型,你可以很容易的從某一張表中的主行移動到它的所有子行里.

datarelationobject是關于join語句在內存中的實現,可用于建立數據類型相同的的parent/child關系,.一旦關系確立,任何破壞這種關系的修改都被禁止.views和relations是完成master/detail架構的兩個方法.請記住view僅是加載于記錄之上的掩碼,但是relation

是位于幾個列之間的動態鏈接,在relation下,你無法更改順序或是設置條件.

如果你的代碼需要1對1的外鍵關系,而且更改數據,最好不用join命令.如果你需要額外的篩選功能,你可以尋求ado.net自定義視圖的支持.

4.轉換現有代碼

大量的asp頁面使用ado對象來抽取數據.讓我們一起來回顧下幾例典型的案例,對你在以后處理移植或者改寫代碼時也許會有幫助。

如果你有從單個recordset生成報表的asp頁面,那么datareader會是你的好幫手。

stringstrconn,strcmd;

strconn="database=myagenda;server=localhost;uid=sa;pwd=;";

strcmd="select*fromnameswhereid="+contactid.text;

sqlconnectionocn=newsqlconnection(strconn);

sqlcommandocmd=newsqlcommand(strcmd,ocn);

ocn.open();

sqldatareaderdr;

ocmd.execute(outdr);

while(dr.read()){

//usedr.getstring(index)or

//dr["fieldname"]toresponse.writedata

}

你可以利用hasmorerows屬性來快速檢查是否datareader為空.如果你僅僅只簡單處理一系列記錄,沒有什么比datareader.更快,更好的對象了,它同樣適用于查詢單個記錄。

datareader.的內容是不可編輯的,但你可以將內容移動到更具管理功能的對象里,如:

datatable或是一個或多個datarow對象.

當你需要處理表與記錄二者之間的復雜關系時,datareader就不是合適的工具了。數據模型鏈接越多,sql命令則會越復雜。導航模塊保有連續性,最后放入緩存的數據往往多于你所需要的,.dataset和datarelationobjects是這種表關系模型的基礎.

為管理parent/child關系,ado同樣也對data-shapingengine進行封裝.總的說來,datashaping和ado.net關系是一回事.就設計方面來說,二者幾乎沒有共同點.shapedrecordsetsct嵌入列表對象中包括了所有數據表信息。ado.net關系是動態鏈接,你可以在兩個數據表間隨時建立.ado依靠于shapingoledbservice提供程序,并使用專門的sql類語言特征以在執行單個ado命令的過程中生成一個分層的recordset.

在ado.net中,關系中涉及的每個對象總是被看成單獨的個體。關系本身作為對象被公開,并且具有一定的行為規則。例如,datarelation對象可以從父行到子行一層層進行更改。您可以通過將foreignkeyconstraint對象添加到datatable的constraints集合中來進行此操作。foreignkeyconstraint對象表示當刪除或更新數值和行時,對通過外鍵關系相關聯的一組列的約束。如前面提到的,一旦設置好了關系,在它按程序預設終止之前,您不能進行可能破壞該關系的更改。

正如早先提到的一樣,一旦設置了relationship,除非它是程序性的終止,你不能夠對它進行修改,那樣會使它突然中斷.

另外,relations沒有遞延性.你可以在customers和orders之間,orders和products之間設置兩個不同的關系.但是,當為了某個customer而對orders導航時,你不能夠從一個order跳到相關的products行.解決方法是,你必須另外打開orders/products關系,鎖定你需要的order,然后獲取相關的行.

程序員需要在aspsession對中存儲記錄嗎?通過ado.net和dataset對象,你可以非常安全的進行工作,而不會引起在"storinganadorecordsetingitmightcauseanaccessviolation"中所論及的麻煩

國內最大的酷站演示中心!
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平定县| 清丰县| 上犹县| 读书| 黎川县| 乐陵市| 定边县| 甘泉县| 巴林右旗| 密云县| 西充县| 左权县| 江陵县| 林芝县| 富川| 古交市| 双江| 嘉黎县| 昌吉市| 马山县| 济源市| 曲周县| 荆门市| 金昌市| 扶沟县| 迁西县| 榆社县| 藁城市| 任丘市| 上饶市| 上虞市| 光泽县| 武胜县| 绵阳市| 新蔡县| 西吉县| 保德县| 大洼县| 青浦区| 洛阳市| 洛阳市|