4-2 ADO.NET-查询和检索数据1
生活随笔
收集整理的這篇文章主要介紹了
4-2 ADO.NET-查询和检索数据1
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
4-2????????? ADO.NET-查詢和檢索數(shù)據(jù)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
??? 在上一節(jié)中,我們介紹了ADO.NET的基本組成結(jié)構(gòu)和特點,詳細(xì)闡述了ADO.NET的五大基本對象,重點論述了ADO.NET數(shù)據(jù)庫訪問的連線式連接方式和斷線式連接方式,詳細(xì)闡述了Connection 對象和Command 對象,介紹了ADO.NET的事務(wù)處理原理與實踐。 u?本節(jié)學(xué)習(xí)目標(biāo): n?掌握DataSet對象 n?DataTable、DataColumn和DataRow對象 n?DataAdapter對象 n?DataReader對象<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />4-2-1? DataSet對象
1.數(shù)據(jù)集DataSet概述
數(shù)據(jù)集DataSet是斷開與數(shù)據(jù)源的連接時,可以被使用的數(shù)據(jù)記錄在內(nèi)存中的緩存。前面在4-1-3節(jié)斷開式數(shù)據(jù)庫訪問連接部分提到,可以把數(shù)據(jù)集DataSet看作是內(nèi)存中的數(shù)據(jù)庫。它在應(yīng)用程序中對數(shù)據(jù)的支持功能十分強(qiáng)大。DataSet一經(jīng)創(chuàng)建,就能在應(yīng)用程序中充當(dāng)數(shù)據(jù)庫的位置,為應(yīng)用程序提供數(shù)據(jù)支持。 數(shù)據(jù)集DataSet的數(shù)據(jù)結(jié)構(gòu)可以在.net開發(fā)環(huán)境中通過向?qū)瓿?#xff0c;也可以通過代碼來增加表、數(shù)據(jù)列、約束以及表之間的關(guān)系。數(shù)據(jù)集DataSet中的數(shù)據(jù)既可以來自數(shù)據(jù)源,也可以通過代碼直接向表中增加數(shù)據(jù)行。這也看出,數(shù)據(jù)集DataSet類似一個客戶端內(nèi)存中的數(shù)據(jù)庫,可以在這個數(shù)據(jù)庫中增加、刪除數(shù)據(jù)表,可以定義數(shù)據(jù)表結(jié)構(gòu)和表之間的關(guān)系,可以增加、刪除表中的行。 數(shù)據(jù)集DataSet不考慮其中的表結(jié)構(gòu)和數(shù)據(jù)是來自數(shù)據(jù)庫、XML文件還是程序代碼,因此數(shù)據(jù)集DataSet不維護(hù)到數(shù)據(jù)源的連接。這緩解了數(shù)據(jù)庫服務(wù)器和網(wǎng)絡(luò)的壓力。對數(shù)據(jù)集DataSet的特點總結(jié)可以總結(jié)為四點: n第一,使用數(shù)據(jù)集對象DataSet無需與數(shù)據(jù)庫直接交互; n第二,DataSet對象是存儲從數(shù)據(jù)庫檢索到的數(shù)據(jù)的對象; n第三,DataSet對象是零個或多個表對象的集合,這些表對象由數(shù)據(jù)行和列、約束和有關(guān)表中數(shù)據(jù)關(guān)系的信息組成; n第四,DataSet對象既可容納數(shù)據(jù)庫的數(shù)據(jù),也可以容納非數(shù)據(jù)庫的數(shù)據(jù)源。2.DataSet的結(jié)構(gòu),常用屬性及方法
數(shù)據(jù)集DataSet是以DataSet對象形式存在的。DataSet對象是一種用戶對象,此對象表示一組相關(guān)表,在應(yīng)用程序中這些表作為一個單元來引用。DataSet對象的常用屬性是Tables、Relations等。DataSet對象的層次結(jié)構(gòu)圖4-22所示: <?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /> 圖4-22 DataSet對象的層次結(jié)構(gòu)圖 DataSet對象由數(shù)據(jù)表及表關(guān)系組成,所以DataSet對象包含DataTable對象集合Tables和DataRelation對象集合Relations。而每個數(shù)據(jù)表又包含行和列以及約束等結(jié)構(gòu),所以DataTable對象包含DataRow對象集合Rows、DataColumn對象集合Columns和Constraint對象集合Constraints。DataSet層次結(jié)構(gòu)中的類請參見表4-10所示: 表4-10 DataSet層次結(jié)構(gòu)中的類表| 類 | 說明 |
| DataTableCollection | 包含特定數(shù)據(jù)集的所有DataTable對象 |
| DataTable | 表示數(shù)據(jù)集中的一個表 |
| DataColumnCollection | 表示DataTable對象的結(jié)構(gòu) |
| DataRowCollection | 表示DataTable對象中的實際數(shù)據(jù)行 |
| DataColumn | 表示DataTable對象中列的結(jié)構(gòu) |
| DataRow | 表示DataTable對象中的一個數(shù)據(jù)行 |
| 屬性 | 說明 |
| DataSetName | 用于獲取或設(shè)置當(dāng)前數(shù)據(jù)集的名稱 |
| Tables | 用于檢索數(shù)據(jù)集中包含的表集合 |
| 方法 | 說明 |
| Clear() | 清除數(shù)據(jù)集中包含的所有表的所有行 |
| HasChanges() | 返回一個布爾值,指示數(shù)據(jù)集是否更改了 |
3.數(shù)據(jù)集的工作原理
數(shù)據(jù)集DataSet的工作原理請參見圖4-24所示: 圖4-24 數(shù)據(jù)集的工作原理圖 圖4-24所示的過程就是數(shù)據(jù)集DataSet的工作原理。首先,客戶端與數(shù)據(jù)庫服務(wù)器端建立連接。然后,由客戶端應(yīng)用程序向數(shù)據(jù)庫服務(wù)器發(fā)送數(shù)據(jù)請求。數(shù)據(jù)庫服務(wù)器接到數(shù)據(jù)請求后,經(jīng)檢索選擇出符合條件的數(shù)據(jù),發(fā)送給客戶端的數(shù)據(jù)集,這時連接可以斷開。接下來,數(shù)據(jù)集以數(shù)據(jù)綁定控件或直接引用等形式將數(shù)據(jù)傳遞給客戶端應(yīng)用程序。如果客戶端應(yīng)用程序在運(yùn)行過程中有數(shù)據(jù)發(fā)生變化,它會修改數(shù)據(jù)集里的數(shù)據(jù)。當(dāng)應(yīng)用程序運(yùn)行到某一階段時,比如應(yīng)用程序需要保存數(shù)據(jù),就可以再次建立客戶端到數(shù)據(jù)庫服務(wù)器端的連接,將數(shù)據(jù)集里的被修改數(shù)據(jù)提交給服務(wù)器,最后再次斷開連接。 把這種不需要實時連接數(shù)據(jù)庫的工作過程叫做面向非連接的數(shù)據(jù)訪問。在DataSet對象中處理數(shù)據(jù)時,客戶端應(yīng)用程序僅僅是在本地機(jī)器上的內(nèi)存中使用數(shù)據(jù)的副本。這緩解了數(shù)據(jù)庫服務(wù)器和網(wǎng)絡(luò)的壓力,因為只有在首次獲取數(shù)據(jù)和編輯完數(shù)據(jù)并將其回傳到數(shù)據(jù)庫時,才能連接到數(shù)據(jù)庫服務(wù)器。 雖然這種面向非連接的數(shù)據(jù)結(jié)構(gòu)有優(yōu)點,但還是存在問題。當(dāng)處于斷開環(huán)境時,客戶端應(yīng)用程序并不知道其他客戶端應(yīng)用程序?qū)?shù)據(jù)庫中原數(shù)據(jù)所做的改動。很有可能得到的是過時的信息。4.案例學(xué)習(xí):通過編碼創(chuàng)建DataSet對象
??? 新建窗體命名為Form5.cs,雙擊Form5的窗體界面,進(jìn)入后臺編碼區(qū)域,在其窗體加載初始化事件中鍵入如下代碼: private void Form5_Load(object sender, EventArgs e) ??????? { ??????????? //建立SQL Server數(shù)據(jù)庫連接 ??????????? string connstring = "Data Source=(local);Initial Catalog=school;User ID=sa"; ??????????? SqlConnection connection = new SqlConnection(connstring); ??????????? connection.Open(); ??????????? string sqlstring = "select * from student"; ??????????? SqlCommand mycom = new SqlCommand(sqlstring, connection); ??????????? SqlDataAdapter adapter = new SqlDataAdapter(); ??????????? adapter.SelectCommand = mycom; ??????????? //創(chuàng)建DataSet對象 ??????????? DataSet SQLds = new DataSet(); ??????????? adapter.Fill(SQLds);//通過SqlDataAdapter對象填充DataSet對象 ??????????? //釋放數(shù)據(jù)庫連接資源。要養(yǎng)成了好的編程習(xí)慣,操作完數(shù)據(jù)后記住打掃垃圾! ??????????? connection.Dispose(); ??????????? connection.Close(); ??????????? connection = null;????????}1.數(shù)據(jù)集的類型
數(shù)據(jù)集的類型分為類型化數(shù)據(jù)集和非類型化數(shù)據(jù)集,關(guān)于對他們的描述請參見圖4-25所示: 圖4-25 數(shù)據(jù)集的分類圖 使用類型化數(shù)據(jù)集訪問列,參見如下代碼: ??????? string employeeName;??????? employeeName = dsEmployees.Emp[0].EmpName; 從dsEmployees數(shù)據(jù)集的Emp表中第一個記錄返回EmpName列,然后將其存儲在employeeName字符串變量中。使用非類型化數(shù)據(jù)集訪問列 ,參見如下代碼: ????????string employeeName;??????? employeeName = dsEmployees.Tables["Emp"].Rows[0]["EmpName"]; 使用Tables集合返回EmpName列。 ? 小知識: typed DataSet和untyped DataSet typed DataSet是從DataSet派生的,它根據(jù)事先定義的Data Schema生成數(shù)據(jù)集,對數(shù)據(jù)集中的字段實行強(qiáng)類型約束。你可以通過它產(chǎn)生的cs文件看到許多方法對DataTable的操作進(jìn)行了封裝,這樣你就可以通過MyDataSet.MyTable.Field對字段進(jìn)行訪問,而不是像DataSet那樣: MyDataSet.Tables["TableName"]["Field"]; 簡化了編程,同時不容易出錯,想象一下如果在"Field"中拼錯了字段名,那么編譯器也不會檢查出來,對于typed DataSet就不用了,如果你Field寫錯的話,那么馬上就可以知道。 還有就是如果你在Typed DataSet包含多數(shù)據(jù)集,同時在XSD中對這些數(shù)據(jù)集建立關(guān)系和約束,那么Type DataSet會生成相應(yīng)的方法來反映這些關(guān)系和約束。如果使用untyped DataSet,你需要自己做。 性能上的考慮:雖然Typed DataSet創(chuàng)建對象實例的時候比unTypede DataSet要多一些開銷(時間和空間),但是在填充數(shù)據(jù)的時候要比untyped DataSet快,這是因為DataAdapter已經(jīng)知道怎么Fill一個Typed DataSet,相比之下,DataSet需要兩次讀取數(shù)據(jù)庫,第一次取得數(shù)據(jù)庫中表的結(jié)構(gòu)信息,第二次才fill數(shù)據(jù)。 Typed DataSet相對于DataSet的缺陷:除了創(chuàng)建的開銷之外,Typed DataSet不如DataSet靈活,因為Typed DataSet一旦確定,數(shù)據(jù)表的結(jié)構(gòu)就固定了,如果需要修改,必須重新生成。 而DataSet你可以隨時根據(jù)需要進(jìn)行操作(比如添加字段,刪除字段等)。1. 案例學(xué)習(xí):數(shù)據(jù)集的類型——通過圖形化界面生成類型化數(shù)據(jù)集
通過圖形化界面生成類型化數(shù)據(jù)集的過程大致分為三步: u?實驗步驟(1): 創(chuàng)建數(shù)據(jù)庫連接對象。參見圖4-26所示: 圖4-26 創(chuàng)建數(shù)據(jù)庫連接對象圖 從工具箱中選中SqlConnection,拖放到窗體上,窗體設(shè)計器的組件欄出現(xiàn)sqlConnection1對象,鼠標(biāo)右擊sqlConnection1對象,選擇“屬性”。在屬性窗口找到ConnectionString屬性,在右側(cè)下拉欄里選擇“新建連接”,彈出“添加連接”窗口。在“添加連接”窗口的服務(wù)器名處填寫“(local)”,選擇“使用SQL Server身份驗證”,用戶名為“sa”,選擇或輸入一個數(shù)據(jù)庫名處選擇“school”。最后點擊“確定”關(guān)閉“添加連接”窗口。ConnectionString屬性右側(cè)欄中出現(xiàn)字符串“Data Source=(local);Initial Catalog=school;User ID=sa”。 前面這個過程可能因不同服務(wù)器、不同數(shù)據(jù)庫、不同帳號而不同,這里只是舉個例子,希望讀者根據(jù)具體情況來完整這一步。 u實驗步驟(2): 添加新數(shù)據(jù)源。參見圖4-27所示: 圖4-27 添加新數(shù)據(jù)源圖 接上一步,在.net開發(fā)環(huán)境的工具欄里選擇“數(shù)據(jù)”菜單中的“添加新數(shù)據(jù)源”,彈出“數(shù)據(jù)源配置向?qū)А贝翱凇T谶@個窗口點擊“數(shù)據(jù)庫”圖標(biāo),點擊“下一步”,然后選擇“schoolConnectionString(Settings)”。再連續(xù)點擊兩次“下一步”,接下來選擇窗體中的表、視圖、存儲過程或者函數(shù)。最后點擊“完成”關(guān)閉窗口。 u實驗步驟(3): 建立類型化數(shù)據(jù)集。參見圖4-28所示: 圖4-28 建立類型化數(shù)據(jù)集圖 接上一步,在工具箱中選擇DataSet,拖放到窗體上,彈出“添加數(shù)據(jù)集”窗口,默認(rèn)選擇類型化數(shù)據(jù)集,名稱為“WindowsApplication1.schoolDataSet”。這個名稱源于數(shù)據(jù)源中的“schoolDataSet”。點擊“確定”關(guān)閉“添加數(shù)據(jù)集”窗口,窗體設(shè)計器的組件欄出現(xiàn)schoolDataSet1對象。經(jīng)過上述三步,在圖形化界面就生成類型化數(shù)據(jù)集。1. 案例學(xué)習(xí):數(shù)據(jù)集的類型——通過圖形化界面生成非類型化數(shù)據(jù)集
通過圖形化界面生成非類型化數(shù)據(jù)集的過程大致也分為三步: u實驗步驟(1): 建立表及主鍵。參見圖4-29所示: 圖4-29 建立表及主鍵圖 在工具箱中選擇DataSet,拖放到窗體上,彈出“添加數(shù)據(jù)集”窗口,選擇“非類型化數(shù)據(jù)集”。點擊“確定”關(guān)閉“添加數(shù)據(jù)集”窗口,窗體設(shè)計器的組件欄出現(xiàn)dataSet1對象。鼠標(biāo)右擊dataSet1對象,選擇“屬性”。在屬性窗口找到Tables屬性,在右側(cè)欄里選擇“…”按鈕,彈出“表集合編輯器”窗口。在“表集合編輯器”窗口中點擊“添加”按鈕,左側(cè)列表框中出現(xiàn)一個表名為“Table1”的項,這是添加的第一個表。“表集合編輯器”窗口的右側(cè)列表的是表Table1的屬性。找到TableName屬性,將其設(shè)置為“student”。找到Columns屬性,在右側(cè)欄里選擇“…”按鈕,彈出“列集合編輯器”窗口。“列集合編輯器”窗口與“表集合編輯器”窗口基本一樣。用類似的辦法連續(xù)點擊五次“添加”按鈕,左側(cè)列表框中出現(xiàn)五項。在右側(cè)屬性欄,將其ColumnName屬性分別設(shè)置為“sno”、“sname”、“ssex”、“sclass”、“birthday”,同時也修改DataType屬性為相應(yīng)的值。最后點擊“關(guān)閉”關(guān)閉“列集合編輯器”窗口。 u?實驗步驟(2): 建立表的主鍵唯一性約束。參見圖4-30所示: 圖4-30 建立表的主鍵唯一性約束圖 接上一步,找到表student的Constraints屬性,在右側(cè)欄里選擇“…”按鈕,彈出“約束集合編輯器”窗口。“約束集合編輯器”窗口與“表集合編輯器”窗口基本一樣。點擊“添加”時要選擇“唯一約束”或“外鍵約束”。選擇“唯一約束”后,彈出“唯一約束”窗口,接下來就要填寫約束名稱,選擇主鍵列“sno”,下面的“主鍵”復(fù)選框也要勾選。點擊“確定”關(guān)閉“唯一約束”窗口。這時“約束集合編輯器”窗口中左側(cè)列表框出現(xiàn)一個項,這是添加的第一個主鍵唯一性約束。 u實驗步驟(3): 建立表的外鍵約束。參見圖4-31所示: 圖4-31 建立表的外鍵約束圖 接上一步,在“約束集合編輯器”窗口點擊“添加”時要選擇“外鍵約束”,彈出“外鍵約束”窗口。在“外鍵約束”窗口填寫約束名稱,選擇外鍵約束的父表(即被引用的表),以及父表被引用的鍵列和當(dāng)前表的外鍵列。同時還要選擇更新規(guī)則、刪除規(guī)則和接受/拒絕規(guī)則。點擊“確定”關(guān)閉“唯一約束”窗口。這時“約束集合編輯器”窗口中左側(cè)列表框出現(xiàn)另一個項,這是添加的第一個外鍵約束。再連續(xù)點擊兩次“關(guān)閉”按鈕,關(guān)閉“約束集合編輯器”窗口和“表集合編輯器”窗口。經(jīng)過上述三步,在圖形化界面就生成非類型化數(shù)據(jù)集。 ? 小知識: 更新、刪除規(guī)則的選擇 更新、刪除以及接受/拒絕規(guī)則中可選項有四種:Cascade、None、SetNull、SetDefault。其中Cascade表示級聯(lián)操作,當(dāng)父表鍵列發(fā)生更新、刪除以及接受/拒絕操作時,子表的外鍵列也發(fā)生相應(yīng)的操作。None表示無操作,當(dāng)父表鍵列發(fā)生更新、刪除以及接受/拒絕操作時,子表的外鍵列不采取任何操作。SetNull表示置空操作,當(dāng)父表鍵列發(fā)生更新、刪除操作時,子表的外鍵列相關(guān)行中的值置空。SetDefault表示置默認(rèn)值操作,當(dāng)父表鍵列發(fā)生更新、刪除操作時,子表的外鍵列相關(guān)行中的值置DefaultValue屬性中默認(rèn)的值。1. 案例學(xué)習(xí):數(shù)據(jù)集的類型——編碼實現(xiàn)非類型化數(shù)據(jù)集
在本節(jié)“通過編碼創(chuàng)建DataSet對象”的案例學(xué)習(xí)中,我們建立了窗體Form5,本案例在Form5窗體之中添加一個Label標(biāo)簽控件,命名為Label1,用以顯示從數(shù)據(jù)庫表之中讀取的相關(guān)數(shù)據(jù)信息,最終實現(xiàn)通過編碼實現(xiàn)非類型化數(shù)據(jù)集的實驗?zāi)康摹?span lang="en-us"> private void Form5_Load(object sender, EventArgs e) { string connstring = "Data Source=(local);Initial Catalog=school;User ID=sa"; ??????????? SqlConnection connection = new SqlConnection(connstring); ??????????? connection.Open(); ??????????? string sqlstring = "select * from student"; ??????????? SqlCommand mycom = new SqlCommand(sqlstring, connection); ??????????? SqlDataAdapter adapter = new SqlDataAdapter(); ??????????? adapter.SelectCommand = mycom; ???? ???????//設(shè)置DataSet對象 ??????????? DataSet ds = new DataSet(); ??????????? adapter.Fill(ds); ??????????? //開始循環(huán)讀取DataSet中的數(shù)據(jù)表信息 ??????????? for (int i = 0; i < ds.Tables[0].Rows.Count; i++) ??????????? { ??????????????? //label1.Text += ds.Tables[0].Rows[i]["sname"].ToString()+"\n"; ??????????????? label1.Text += ds.Tables[0].Rows[i][2].ToString() + "\n"; ??????????? } ??????????? //釋放數(shù)據(jù)庫連接資源 ??????????? connection.Dispose(); ??????????? connection.Close(); ??????????? connection = null;??????????? ??????? }轉(zhuǎn)載于:https://blog.51cto.com/qianshao/216013
總結(jié)
以上是生活随笔為你收集整理的4-2 ADO.NET-查询和检索数据1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。