ado.net的技術(shù)路途__第1頁
ado.net的技術(shù)路途__第2頁
ado.net的技術(shù)路途__第3頁
ado.net的技術(shù)路途__第4頁
ado.net的技術(shù)路途__第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、的技術(shù)路途_ 以往我們對數(shù)據(jù)庫進(jìn)行操作的方法是先連接上一個數(shù)據(jù)庫,在保持連接的狀態(tài)下進(jìn)行數(shù)據(jù)的各種操作,如增刪改查。這樣的狀況會有兩個弊病,一是始終保持連接會造成資源的鋪張,二是網(wǎng)絡(luò)的各種不穩(wěn)定因素會是這種連接發(fā)生丟失,從而對數(shù)據(jù)的操作也將丟失。 鑒于以上所說道的兩個或更多的其他緣由,微軟提出了另一種操作模式,就是非連接模式的數(shù)據(jù)操作,當(dāng)然也沒有丟棄以前ado中那種典型的連接模式的數(shù)據(jù)操作,故而誕生了及其兩種典型的數(shù)據(jù)操作模式,即連接模式和非連接模式。 當(dāng)然,無論是采納那種模式來操作數(shù)據(jù),首先是要取得數(shù)據(jù)連接然后對數(shù)據(jù)源進(jìn)行操作或?qū)?shù)據(jù)源的副本進(jìn)行操作。則連接為第一步必需完成的工作。連接的方法

2、和ado時代沒有多大的差別,不外乎與首先建立一個連接對象(或叫做實(shí)例化一個連接對象),要完成連接必需知道連接的數(shù)據(jù)源地址,有的還要知道數(shù)據(jù)源供應(yīng)者。下面是典型的列子: string connString = Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind; string connstring=Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=Northwind; /一般來說OLEDB數(shù)據(jù)源需要設(shè)定provider 一次到位的實(shí)例化連接對

3、象 OleDbConnection myconn=new OleDbConnection(connstring); 或用Connection的屬性設(shè)置連接對象的數(shù)據(jù)源 OleDbConnection myconn=new OleDbConnection(); myconn.ConnectionString=connstring; 接下來就可用connection的open()方法打開連接了 myconn.open() 連接已經(jīng)完成,接下來進(jìn)入最重要的數(shù)據(jù)操作階段(需要具體了解連接對象建立的同學(xué)可以自己去多查查資料哦) 一、連接模式 連接模式下 擔(dān)負(fù)主要責(zé)任的對象是DataReader(然而說到

4、DataReader那又不得不提到ExcuteReader()這個方法,由于DataReader是沒有構(gòu)造函數(shù)的一個類,DataReader只能通過command類的excutereader()方法來實(shí)例化),所以Datareader有以下幾個特點(diǎn): 1.它無構(gòu)造函數(shù)只能通過command的excutereader()方法來實(shí)例化, 如:sqlcommand sqlcm=new sqlcommand(); sqldatarader dr =sqlcm.excutereader(); 2.它用法數(shù)據(jù)庫時數(shù)據(jù)庫連接必需保持打開狀態(tài)(在這種狀態(tài)下無法進(jìn)行與connection相關(guān)的操作) 3.它只能

5、從前往后遍歷信息,不能中途停下修改數(shù)據(jù) 4.基于我前面說過的始終保持連接鋪張資源,加上上面的其次條,那么我們必需用完就關(guān)閉,如: dr.close()或者假如我們怕遺忘關(guān)閉,在實(shí)例化時給個參數(shù)commandbehavior.closeconnection sqldatarader dr = cmd.executereader(commandbehavior.closeconnection); DataReader的用法比較敏捷,一般都是通過條件推斷來實(shí)現(xiàn),如: while(dr.reader() . 也有人為了操作的某種目的,通過DataReader數(shù)據(jù)讀出來,然后存在一個新建的空DataTa

6、ble中從而將DataReader轉(zhuǎn)化成了DataTable,這種做法畢竟是否可取,還真是仁者見仁智者見智。假如您實(shí)在是想在DataTable和DataReader之間進(jìn)行轉(zhuǎn)化,可以用下面的方法: DataReader轉(zhuǎn)DataTable: DataTable.Load(DataReader對象,LoadOption.OverwriteChanges); DataTable轉(zhuǎn)DataReader: DataReader Reader=DataTable.CreateDataReader() 二、非連接模式 非連接模式下?lián)?fù)主要責(zé)任的兩個對象是DataAdapter和DataSet 非連接模式下

7、DataAdapter起到了一個橋梁的作用,看到這個有的人可能會聯(lián)想到網(wǎng)絡(luò)適配器或電源適配器,沒錯,他們的功能都是一樣的,將各種不同的網(wǎng)絡(luò)類型電源類型轉(zhuǎn)化成統(tǒng)一能夠滿足要求的類型,這里的DataAdapter就是數(shù)據(jù)適配器,將各種不同類型的數(shù)據(jù)源經(jīng)過適配轉(zhuǎn)化成可以填入Dataset的數(shù)據(jù)。 DataAdatper對象的用法一般有兩種作用,一種是通過command對象如sqlcommand來執(zhí)行sql語句,從數(shù)據(jù)源中檢測數(shù)據(jù),并將檢索到的結(jié)果填充到DataSet中;還有一種就是把用戶對DataSet對象對數(shù)據(jù)的轉(zhuǎn)變更新到數(shù)據(jù)源中去。 有人要忍不住問了,為什么非連接模式不需要做這一步呢? 其實(shí)連接

8、模式下通過command對象將全部對數(shù)據(jù)對象的單步操作都挺直更新到數(shù)據(jù)庫里去了,這叫單體操作。 而連接模式下Dataset由于和數(shù)據(jù)服務(wù)器斷開的,對單體的操作沒有機(jī)會隨時更新到數(shù)據(jù)庫里去,這也就要求有這么一個對象在全部的數(shù)據(jù)操作完成后對各種數(shù)據(jù)操作(如增刪改等操作)用各種對應(yīng)的SQL指令統(tǒng)一更新到數(shù)據(jù)庫里去,而這個對象就是DataAdapterle ,所以可以這么說,DataAdapterle 采納的它內(nèi)嵌的SQL指令集進(jìn)行的批量SQL操作。 我們首先來看看command和dataadapter的實(shí)例化,一般我們可以這樣來實(shí)例化他們: OleDbcommand olecmd=new OleDb

9、command(sqlString,connObj); OleDataAdapter oledpt=new OleDataAdapter(sqlString,connObj); 他們都都接收了一個SQL字符串和一個連接對象Connection,那么Command和DataAdapter有什么區(qū)分呢? 在面對sql語句時他們的區(qū)分是: Command主要是運(yùn)行純粹的SQL指令,挺直使SQL語句的操作得以實(shí)施。 DataAdapter則內(nèi)嵌著一套SQL的指令(也就是它的四個屬性),如select,delete,insert,update,等到需要執(zhí)行其中之一的時候還是要Command對象來出面,即

10、對內(nèi)嵌的指令對象進(jìn)行實(shí)例化,假如沒有實(shí)例化就調(diào)用,經(jīng)常就會報錯,不能通過編譯(許多人在用dataadpter的update方法時就出錯),所以我們經(jīng)常會這樣的用: oledpt.selectcomand=new olecommand(); 對于取數(shù)據(jù) command結(jié)合excutereader()利用Datareader來實(shí)現(xiàn) DataAdapter利用Fill()可以實(shí)現(xiàn),但不應(yīng)非要你用fill來實(shí)現(xiàn)。 這里說說Fill()這個方法,打開DataAdapter可以發(fā)覺,fill()方法來自他的父類的實(shí)現(xiàn),其中Fill方法調(diào)用了FillFromCommand或FillFromReader方法。

11、這兩個方法中也分別調(diào)用了command對象excutereader。所以接下來的事情就不難理解了,感愛好的伴侶可以自己去看看fill的實(shí)現(xiàn)方法。 DataAdapter對象可以隱蔽和Connection、Command對象溝通的詳情,通過DataAdapter對象建立、初始化 DataTable,從而和DataSet對象結(jié)合起來在內(nèi)存存放數(shù)據(jù)表副本,實(shí)現(xiàn)離線式數(shù)據(jù)庫操作。DataAdapter對象允許將DataSet對象中的數(shù)據(jù)保存到數(shù)據(jù)源中,也可以從數(shù)據(jù)源中讀取數(shù)據(jù),并且也可以底層數(shù)據(jù)保存體進(jìn)行數(shù)據(jù)的添加、刪除、更新等操作。 DataAdapter對象含有四個不同的操作指令,分別如下: (1

12、)、SelectCommand:用來或去數(shù)據(jù)源中的記錄; (2)、InsertCommand:用來向數(shù)據(jù)源中新插入一條記錄; (3)、UpdateCommand:用來更新數(shù)據(jù)源中的數(shù)據(jù); (4)、DeleteCommand:用來刪除數(shù)劇源中的記錄。 值得提出來格外說明的是,在實(shí)例化了DataAdapter對象后,此DataAdapter仍舊是一個沒有實(shí)際作用的數(shù)據(jù)適配器,由于它對數(shù)據(jù)庫和數(shù)據(jù)集的操作事實(shí)上是通過它的四個Command對象(SelectCommand,InsertCommand,UpdateCommand,DeleteCommand)來實(shí)現(xiàn)的。所以我們實(shí)例化了SqlDataAda

13、pter對象后需要再實(shí)例化它相關(guān)的SqlCommand對象 SqlAdapter.SelectCommand = new SqlCommand(); SqlAdapter.InsertCommand = new SqlCommand(); SqlAdapter.UpdateCommand = new SqlCommand(); SqlAdapter.DeleteCommand = new SqlCommand(); 這四個SqlCommand的引用實(shí)際都指向一個SqlCommand對象的實(shí)例,另外,利用commandbuilder對象可以自動實(shí)例化三個指令(Insertcommand,Dele

14、teCommand,Updatecommand)但留意,要自動生成三個指令須用法實(shí)例化好了的SelectCommand來檢索所需要的元素,那么就需要留意DataAdapter的實(shí)例化方式了,假如采納空參數(shù)方法實(shí)例化則須單獨(dú)設(shè)置SelectCommand屬性,才可以用法commandbuilder,如: SqlDataAdapter adapter = new SqlDataAdapter(); adapter.SelectCommand = new SqlCommand(queryString, connection); SqlCommandBuilder builder = new SqlC

15、ommandBuilder(adapter); 當(dāng)如,假如是采納有參數(shù)實(shí)例化,則無須格外聲明selectCommand的屬性,由于這種有參數(shù)實(shí)例化的DataAdapter已經(jīng)在實(shí)例化時自動完成了selectcommand屬性,如 SqlDataAdapter adapter = new SqlDataAdapter(“Select * from table,sqlconn); SqlCommandBuilder builder = new SqlCommandBuilder(adapter); 所以,一般空參數(shù)實(shí)例化的dataadapter與selectcommand屬性設(shè)置時同時消失的。有參

16、數(shù)的dataadapter實(shí)例化是可以挺直用法commandbuilder的。 DataSet的斷開模式是相對于數(shù)據(jù)服務(wù)器的斷開,不至于每次都要和數(shù)據(jù)服務(wù)器發(fā)生連接,而DataSet的數(shù)據(jù)實(shí)際是存在服務(wù)的高速緩存中(有的人誤以為是存在客戶端的,那就大錯特錯了,想一下便知道,那樣數(shù)據(jù)確定是擔(dān)心全的),這也就是說假如數(shù)據(jù)量大服務(wù)器的內(nèi)存就鋪張嚴(yán)峻,這也是非連接模式的一個缺點(diǎn),相比之下DataReader那種讀一行存一行的做法就節(jié)約內(nèi)存多了。 三、回顧兩種模式的關(guān)系 兩種模式表面看起來走了兩條路途,但有許多共同點(diǎn),最突出的要數(shù)以下兩個方面: 1、【開頭相同】它們所需的數(shù)據(jù)連接的形式一樣,開頭都要通過建立connection對象來完成連接 2、【最終相同】它們都需要在sqlcommand對象的配合下執(zhí)行sql語句的操作,最終在sqlcommand對象的配合下實(shí)現(xiàn)對數(shù)據(jù)的增刪改查操作。 如連接模式的sql操作: sqlcommand sqlcm=new sqlc

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論