午夜国产狂喷潮在线观看|国产AⅤ精品一区二区久久|中文字幕AV中文字幕|国产看片高清在线

    ado.net的技術路線
    來源:易賢網(wǎng) 閱讀:1234 次 日期:2014-08-20 14:00:11
    溫馨提示:易賢網(wǎng)小編為您整理了“ado.net的技術路線”,方便廣大網(wǎng)友查閱!

    以往我們對數(shù)據(jù)庫進行操作的方法是先連接上一個數(shù)據(jù)庫,在保持連接的狀態(tài)下進行數(shù)據(jù)的各種操作,如增刪改查。這樣的狀況會有兩個弊病,一是始終保持連接會造成資源的浪費,二是網(wǎng)絡的各種不穩(wěn)定因素會是這種連接發(fā)生丟失,從而對數(shù)據(jù)的操作也將丟失。

    鑒于以上所說道的兩個或更多的其他原因,微軟提出了另一種操作模式,就是非連接模式的數(shù)據(jù)操作,當然也沒有丟棄以前ado中那種典型的連接模式的數(shù)據(jù)操作,故而誕生了ado.net及其兩種典型的數(shù)據(jù)操作模式,即連接模式和非連接模式。

    當然,無論是采用那種模式來操作數(shù)據(jù),首先是要取得數(shù)據(jù)連接然后對數(shù)據(jù)源進行操作或對數(shù)據(jù)源的副本進行操作。則連接為第一步必須完成的工作。連接的方法和ado時代沒有多大的差別,不外乎與首先建立一個連接對象(或叫做實例化一個連接對象),要完成連接必須知道連接的數(shù)據(jù)源地址,有的還要知道數(shù)據(jù)源提供者。下面是典型的列子:

    string connString = "Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;";

    string connstring="Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=Northwind;";

    //一般來說OLEDB數(shù)據(jù)源需要設定provider

    一次到位的實例化連接對象

    OleDbConnection myconn=new OleDbConnection(connstring);

    或用Connection的屬性設置連接對象的數(shù)據(jù)源

    OleDbConnection myconn=new OleDbConnection();

    myconn.ConnectionString=connstring;

    接下來就可用connection的open()方法打開連接了

    myconn.open()

    連接已經(jīng)完成,接下來進入最重要的數(shù)據(jù)操作階段(需要詳細了解連接對象建立的同學可以自己去多查查資料哦)

    一、連接模式

    連接模式下 擔負主要責任的對象是DataReader(然而說到DataReader那又不得不提到ExcuteReader()這個方法,因為DataReader是沒有構造函數(shù)的一個類,DataReader只能通過command類的excutereader()方法來實例化),所以Datareader有以下幾個特點:

    1.它無構造函數(shù)只能通過command的excutereader()方法來實例化,

    如:sqlcommand sqlcm=new sqlcommand(); sqldatarader dr =sqlcm.excutereader();

    2.它使用數(shù)據(jù)庫時數(shù)據(jù)庫連接必須保持打開狀態(tài)(在這種狀態(tài)下無法進行與connection相關的操作)

    3.它只能從前往后遍歷信息,不能中途停下修改數(shù)據(jù)

    4.基于我前面說過的始終保持連接浪費資源,加上上面的第二條,那么我們必須用完就關閉,如:

    dr.close()或者如果我們怕忘記關閉,在實例化時給個參數(shù)commandbehavior.closeconnection

    sqldatarader dr = cmd.executereader(commandbehavior.closeconnection);

    DataReader的用法比較靈活,一般都是通過條件判斷來實現(xiàn),如:

    while(dr.reader())

    {

    ................

    }

    也有人為了操作的某種目的,通過DataReader數(shù)據(jù)讀出來,然后存在一個新建的空DataTable中從而將DataReader轉化成了DataTable,這種做法究竟是否可取,還真是仁者見仁智者見智。如果您實在是想在DataTable和DataReader之間進行轉化,可以用下面的方法:

    DataReader轉DataTable:

    DataTable.Load(DataReader對象,LoadOption.OverwriteChanges);

    DataTable轉DataReader:

    DataReader Reader=DataTable.CreateDataReader()

    二、非連接模式

    非連接模式下?lián)撝饕熑蔚膬蓚€對象是DataAdapter和DataSet

    非連接模式下DataAdapter起到了一個橋梁的作用,看到這個有的人可能會聯(lián)想到網(wǎng)絡適配器或電源適配器,沒錯,他們的功能都是一樣的,將各種不同的網(wǎng)絡類型電源類型轉化成統(tǒng)一能夠滿足要求的類型,這里的DataAdapter就是數(shù)據(jù)適配器,將各種不同類型的數(shù)據(jù)源經(jīng)過適配轉化成可以填入Dataset的數(shù)據(jù)。

    DataAdatper對象的使用一般有兩種作用,一種是通過command對象如sqlcommand來執(zhí)行sql語句,從數(shù)據(jù)源中檢測數(shù)據(jù),并將檢索到的結果填充到DataSet中;還有一種就是把用戶對DataSet對象對數(shù)據(jù)的改變更新到數(shù)據(jù)源中去。

    有人要忍不住問了,為什么非連接模式不需要做這一步呢???

    其實連接模式下通過command對象將所有對數(shù)據(jù)對象的單步操作都直接更新到數(shù)據(jù)庫里去了,這叫單體操作。

    而連接模式下Dataset因為和數(shù)據(jù)服務器斷開的,對單體的操作沒有機會隨時更新到數(shù)據(jù)庫里去,這也就要求有這么一個對象在所有的數(shù)據(jù)操作完成后對各種數(shù)據(jù)操作(如增刪改等操作)用各種對應的SQL命令統(tǒng)一更新到數(shù)據(jù)庫里去,而這個對象就是DataAdapterle ,所以可以這么說,DataAdapterle 采用的它內嵌的SQL命令集進行的批量SQL操作。

    我們首先來看看command和dataadapter的實例化,一般我們可以這樣來實例化他們:

    OleDbcommand olecmd=new OleDbcommand(sqlString,connObj);

    OleDataAdapter oledpt=new OleDataAdapter(sqlString,connObj);

    他們都都接收了一個SQL字符串和一個連接對象Connection,那么Command和DataAdapter有什么區(qū)別呢?

    在面對sql語句時他們的區(qū)別是:

    Command主要是運行純粹的SQL命令,直接使SQL語句的操作得以實施。

    DataAdapter則內嵌著一套SQL的命令(也就是它的四個屬性),如select,delete,insert,update,等到需要執(zhí)行其中之一的時候還是要Command對象來出面,即對內嵌的命令對象進行實例化,如果沒有實例化就調用,常常就會報錯,不能通過編譯(很多人在用dataadpter的update方法時就出錯),所以我們常常會這樣的用:

    oledpt.selectcomand=new olecommand();

    對于取數(shù)據(jù)

    command結合excutereader()利用Datareader來實現(xiàn)

    DataAdapter利用Fill()可以實現(xiàn),但不應非要你用fill來實現(xiàn)。

    這里說說Fill()這個方法,打開DataAdapter可以發(fā)現(xiàn),fill()方法來自他的父類的實現(xiàn),其中Fill方法調用了FillFromCommand或FillFromReader方法。這兩個方法中也分別調用了command對象excutereader。所以接下來的事情就不難理解了,感興趣的朋友可以自己去看看fill的實現(xiàn)方法。

    DataAdapter對象可以隱藏和Connection、Command對象溝通的細節(jié),通過DataAdapter對象建立、初始化 DataTable,從而和DataSet對象結合起來在內存存放數(shù)據(jù)表副本,實現(xiàn)離線式數(shù)據(jù)庫操作。DataAdapter對象允許將DataSet對象中的數(shù)據(jù)保存到數(shù)據(jù)源中,也可以從數(shù)據(jù)源中讀取數(shù)據(jù),并且也可以底層數(shù)據(jù)保存體進行數(shù)據(jù)的添加、刪除、更新等操作。

    DataAdapter對象含有四個不同的操作命令,分別如下:

    (1)、SelectCommand:用來或去數(shù)據(jù)源中的記錄;

    (2)、InsertCommand:用來向數(shù)據(jù)源中新插入一條記錄;

    (3)、UpdateCommand:用來更新數(shù)據(jù)源中的數(shù)據(jù);

    (4)、DeleteCommand:用來刪除數(shù)劇源中的記錄。

    值得提出來特別說明的是,在實例化了DataAdapter對象后,此DataAdapter仍然是一個沒有實際作用的數(shù)據(jù)適配器,因為它對數(shù)據(jù)庫和數(shù)據(jù)集的操作實際上是通過它的四個Command對象(SelectCommand,InsertCommand,UpdateCommand,DeleteCommand)來實現(xiàn)的。所以我們實例化了SqlDataAdapter對象后需要再實例化它相關的SqlCommand對象

    SqlAdapter.SelectCommand = new SqlCommand();

    SqlAdapter.InsertCommand = new SqlCommand();

    SqlAdapter.UpdateCommand = new SqlCommand();

    SqlAdapter.DeleteCommand = new SqlCommand();

    這四個SqlCommand的引用實際都指向一個SqlCommand對象的實例,另外,利用commandbuilder對象可以自動實例化三個命令(Insertcommand,DeleteCommand,Updatecommand)但注意,要自動生成三個命令須使用實例化好了的SelectCommand來檢索所需要的元素,那么就需要注意DataAdapter的實例化方式了,如果采用空參數(shù)方法實例化則須單獨設置SelectCommand屬性,才可以使用commandbuilder,如:

    SqlDataAdapter adapter = new SqlDataAdapter();

    adapter.SelectCommand = new SqlCommand(queryString, connection);

    SqlCommandBuilder builder = new SqlCommandBuilder(adapter);

    當如,如果是采用有參數(shù)實例化,則無須特別聲明selectCommand的屬性,因為這種有參數(shù)實例化的DataAdapter已經(jīng)在實例化時自動完成了selectcommand屬性,如

    SqlDataAdapter adapter = new SqlDataAdapter(“Select * from table",sqlconn);

    SqlCommandBuilder builder = new SqlCommandBuilder(adapter);

    所以,一般空參數(shù)實例化的dataadapter與selectcommand屬性設置時同時出現(xiàn)的。有參數(shù)的dataadapter實例化是可以直接使用commandbuilder的。

    DataSet的斷開模式是相對于數(shù)據(jù)服務器的斷開,不至于每次都要和數(shù)據(jù)服務器發(fā)生連接,而DataSet的數(shù)據(jù)實際是存在服務的高速緩存中(有的人誤以為是存在客戶端的,那就大錯特錯了,想一下便知道,那樣數(shù)據(jù)肯定是不安全的),這也就是說如果數(shù)據(jù)量大服務器的內存就浪費嚴重,這也是非連接模式的一個缺點,相比之下DataReader那種讀一行存一行的做法就節(jié)約內存多了。

    三、回顧兩種模式的關系

    兩種模式表面看起來走了兩條路線,但有很多共同點,最突出的要數(shù)以下兩個方面:

    1、【開始相同】它們所需的數(shù)據(jù)連接的形式一樣,開始都要通過建立connection對象來完成連接

    2、【最終相同】它們都需要在sqlcommand對象的配合下執(zhí)行sql語句的操作,最終在sqlcommand對象的配合下實現(xiàn)對數(shù)據(jù)的增刪改查操作。

    如連接模式的sql操作:

    sqlcommand sqlcm=new sqlcommand();//很顯然是用了sqlcommand的實例對象

    sqldatarader dr =sqlcm.excutereader();

    ? if(dr.HasRow)

    ? {

    while(dr.read())

    {

    dr[""]..........//獲取字段的值

    }

    }

    非連接模式的sql操作:

    sqlDataAdapter slqad=new sqlDataAdapter();

    sqlad.selectcommand=new sqlcommand(sqlstring,conn);//很顯然,這里也用了sqlcommand

    更多信息請查看IT技術專欄

    更多信息請查看網(wǎng)絡編程
    易賢網(wǎng)手機網(wǎng)站地址:ado.net的技術路線

    2025國考·省考課程試聽報名

    • 報班類型
    • 姓名
    • 手機號
    • 驗證碼
    關于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
    工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
    聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
    咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網(wǎng)