ASP.NET立即上手教程(9)_.Net教程
推薦:ASP.NET立即上手教程(7)Web Forms 用戶控件 用戶控件介紹 除了ASP.NET提供的內(nèi)建的服務(wù)器控件外,你還可以使用已經(jīng)掌握的制作WEB FORMS 頁面的技術(shù),輕松的定義自己的控件。實(shí)際上,只需要稍微改動(dòng)一下,幾乎任何W
服務(wù)器端數(shù)據(jù)介紹
數(shù)據(jù)訪問是現(xiàn)實(shí)世界中應(yīng)用程序的核心內(nèi)容。Asp.net提供了一套豐富的控件,他與CLR(通用語言運(yùn)行庫)提供的用來管理數(shù)據(jù)訪問的APIs(應(yīng)用程序接口)緊密結(jié)合。本章預(yù)排幾個(gè)反復(fù)使用asp.net的DateGrid控件來綁定SQL查詢結(jié)果和XML數(shù)據(jù)文件的例子。本章假定學(xué)習(xí)者熟悉數(shù)據(jù)庫基礎(chǔ)和SQL查詢語言。
Wincheer注:預(yù)排(walk through)這個(gè)詞不知道該怎樣準(zhǔn)確翻譯,他的意思是在計(jì)算機(jī)程序設(shè)計(jì)中,在一個(gè)小組內(nèi)進(jìn)行有組織的討論,以便對(duì)計(jì)算機(jī)程序的邏輯進(jìn)行跟蹤檢查的一個(gè)過程。
服務(wù)器端數(shù)據(jù)訪問比較獨(dú)特,其原因在于web頁面是無態(tài)的。這就導(dǎo)致在試圖執(zhí)行事務(wù),如插入或者更新記錄的時(shí)候,出現(xiàn)了一些有難度的挑戰(zhàn)。正如你將在本章看到的,DataGrid控件能夠幫助管理這些挑戰(zhàn),允許你濃縮更多的應(yīng)用程序邏輯,并且減少事件處理和狀態(tài)管理的細(xì)節(jié)。
Connections(連接)、Commands(命令)、和Datasets(數(shù)據(jù)集)
通用語言運(yùn)行時(shí)刻(CLR)提供了一整套管理數(shù)據(jù)訪問的APIs,用來增強(qiáng)數(shù)據(jù)應(yīng)用程序開發(fā)環(huán)境。這些應(yīng)用程序接口用一致的方式來取得和填充數(shù)據(jù),而不管實(shí)際的數(shù)據(jù)源是什么(SQL Server, OLEDB, XML,等等)最常用的三個(gè)對(duì)象是connections, commands, 和 datasets.
Connection 表示到數(shù)據(jù)存儲(chǔ)的物理連接,例如連接SQL Server 或者 XML文件。
Command 表示取得(select)或者操作(insert, update, delete)數(shù)據(jù)存儲(chǔ)的命令。
Dataset 表示應(yīng)用程序用以工作的實(shí)際數(shù)據(jù)。注意datasets 總是與他們的數(shù)據(jù)源連接和數(shù)據(jù)模型分離,并且可以被獨(dú)立修改。 不過,對(duì)dataset進(jìn)行修改,可以很容易的與原始數(shù)據(jù)模型協(xié)調(diào)一致。
關(guān)于在通用語言運(yùn)行時(shí)刻管理數(shù)據(jù)訪問的更多細(xì)節(jié)問題,請(qǐng)參閱ADO.NET概述。
訪問基于SQL的數(shù)據(jù)
應(yīng)用程序常常需要對(duì)SQL數(shù)據(jù)庫執(zhí)行一個(gè)或多個(gè)select, insert, update, 或者delete 語句。下面的表格展示了一些實(shí)現(xiàn)這些功能的示例代碼。
| 以下為引用的內(nèi)容: 功能 舉例 ------------------------------------------------------------------ 簡(jiǎn)單查詢 | SELECT * from Employees WHERE FirstName = 'Bradley'; ------------------------------------------------------------------ 聯(lián)合查詢 | SELECT * from Employees E, Managers M WHERE E.FirstName = M.FirstName; ------------------------------------------------------------------ 插入 | INSERT into Employees VALUES ('123-45-6789','Bradley','Millington','Program Manager'); ------------------------------------------------------------------ 更新 | UPDATE Employees SET Title = 'Development Lead' WHERE FirstName = 'Bradley'; ------------------------------------------------------------------ 刪除 | DELETE from Employees WHERE Productivity < 10; ------------------------------------------------------------------ |
要想讓你的頁面能夠訪問SQL數(shù)據(jù)庫,必須在頁面中引入System.Data 和 System.Data.SqlClient名稱空間:
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
為了從SQL數(shù)據(jù)庫執(zhí)行select查詢,你需要通過連接字符串建立一個(gè)連接到數(shù)據(jù)庫的SqlConnection對(duì)象, 然后構(gòu)造一個(gè)包含查詢語句的SqlDataAdapter對(duì)象。為了用查詢的返回結(jié)果填充到DataSet 對(duì)象,需要調(diào)用SqlDataAdapter的Fill方法。
| 以下為引用的內(nèi)容: SqlConnection myConnection = new SqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes"); SqlDataAdapter myCommand = new SqlDataAdapter("select * from Authors", myConnection); DataSet ds = new DataSet(); myCommand.Fill(ds, "Authors"); |
正如本章前面提到的那樣,使用dataset的好處在于提供了一個(gè)分離的數(shù)據(jù)庫視圖。你可以在應(yīng)用程序中操作dataset,然后將你的修改與實(shí)際的數(shù)據(jù)庫一致。對(duì)于長時(shí)間運(yùn)行的應(yīng)用程序來說,由于避免了頻繁的讀取數(shù)據(jù)源,因而是最好的處理辦法。對(duì)于web應(yīng)用程序來說,往往使用簡(jiǎn)短的操作(通常只是簡(jiǎn)單的顯示數(shù)據(jù))來處理客戶端的請(qǐng)求。在這種情況下,我們就可以使用SqlDataReader來代替DataSet對(duì)象。
SqlDataReader對(duì)象提供了一種從sql數(shù)據(jù)庫取得數(shù)據(jù)時(shí),只向前,只讀的指針。由于SqlDataReader對(duì)象使用表格式數(shù)據(jù)流(TDS)直接從數(shù)據(jù)庫連接讀取數(shù)據(jù),所以,在允許使用的情況下,他的執(zhí)行效率高于DataSet。
使用SqlDataReader對(duì)象的時(shí)候,需要使用SqlCommand來代替SqlDataAdapter。SqlCommand 使用 ExecuteReader 方法得到SqlDataReader對(duì)象。注意在使用SqlCommand的時(shí)候,必須顯式地打開和關(guān)閉SqlConnection。調(diào)用ExecuteReader方法之后,SqlDataReader對(duì)象就可以作為數(shù)據(jù)源綁定到ASP.NET服務(wù)器控件了。下一個(gè)小節(jié)將會(huì)演示這種情況。
| 以下為引用的內(nèi)容: SqlConnection myConnection = new SqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes"); SqlCommand myCommand = new SqlCommand("select * from Authors", myConnection); myConnection.Open(); SqlDataReader dr = myCommand.ExecuteReader(); ... myConnection.Close(); |
當(dāng)執(zhí)行一條不需要返回?cái)?shù)據(jù)的SQL命令,如inserts, updates, 和 deletes,也使用SqlCommand。該命令通過調(diào)用ExecuteNonQuery方法來執(zhí)行,返回實(shí)際處理的行數(shù)。注意使用SqlCommand的時(shí)候,必須顯式的打開連接;而SqlDataAdapter則自動(dòng)的打開連接。
| 以下為引用的內(nèi)容: SqlConnection myConnection = new SqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes"); SqlCommand myCommand = new SqlCommand( "UPDATE Authors SET phone='(800) 555-5555' WHERE au_id = '123-45-6789'", myConnection); myCommand.Connection.Open(); myCommand.ExecuteNonQuery(); myCommand.Connection.Close(); |
重要提示:頁面執(zhí)行完畢之后,記得務(wù)必將數(shù)據(jù)模型的連接關(guān)閉。否則的話,當(dāng)?shù)却厥展δ芴幚眄撁鎸?shí)例的時(shí)候,可能在不經(jīng)意間就消耗盡連接數(shù)限制。
將SQL數(shù)據(jù)綁定到DataGrid
下面的例子展示了將一個(gè)簡(jiǎn)單的查詢語句綁定到DataGrid 控件。DataGrid 交付了一個(gè)包含sql數(shù)據(jù)的表。
類似數(shù)據(jù)綁定那一章提到的DropDownList, DataGrid 控件支持Ienumerable或者 Icollection 類型的DataSource屬性,就如同DataSet一樣。你可以通過將(包含在DataSet中的)表的DefaultView屬性賦值給想使用的(DataSet中的)表的名稱,來使用DataSet控件, DefaultView 屬性表示DataSet中當(dāng)前表的狀態(tài),包含應(yīng)用程序代碼所作的任何改變(例如行刪除或者值的改變)。設(shè)置了DataSource 屬性以后,可以調(diào)用DataBind()來填充控件。
| 以下為引用的內(nèi)容: MyDataGrid.DataSource=ds.Tables["Authors"].DefaultView; MyDataGrid.DataBind(); |
另一個(gè)相同的語法是同時(shí)指定DataSource 和DataMember. 在本例中, ASP.NET自動(dòng)為你獲取了取得了DefaultView。
| 以下為引用的內(nèi)容: MyDataGrid.DataSource=ds; MyDataGrid.DataMember="Authors"; MyDataGrid.DataBind(); |
你也可以直接綁定到SqlDataReader。如果你僅僅顯示數(shù)據(jù),那么SqlDataReader 的"只向前"特性非常適合這種場(chǎng)合,同時(shí)你可以得到更高的執(zhí)行性能。
注意:在本章的剩余部分,我們使用的都是DataSet這種數(shù)據(jù)訪問模式來演示;實(shí)際上,這些例子也同樣可以使用SQLDataReader來重寫。
執(zhí)行用參數(shù)表示的Select命令
你也可以使用SqlDataAdapter對(duì)象來執(zhí)行帶參數(shù)的select語句。下面的例子演示如何使用select HtmlControl控件傳遞的值來改變查詢的結(jié)果。
SqlDataAdapter 包含Parameters 集合,可以使用變量標(biāo)識(shí)符(名稱前加一個(gè)"@") 來代替值。 你可以給這個(gè)集合增加一個(gè)新的SqlParameter 來指定參數(shù)的名稱、類型、和大小,然后設(shè)置他的Value屬性的值。
| 以下為引用的內(nèi)容: myCommand.SelectCommand.Parameters.Add(new SqlParameter("@State", SqlDbType.NVarChar, 2)); myCommand.SelectCommand.Parameters["@State"].Value = MySelect.Value; |
重要提示:注意DataGrid的EnableViewState屬性缺省設(shè)置是false。如果在每一次頁面請(qǐng)求時(shí)填充數(shù)據(jù),就沒有必要讓DataGrid保存表單發(fā)送的狀態(tài)信息。由于DataGrid保存它包含的所有的狀態(tài)的數(shù)據(jù),因此將EnableViewState關(guān)閉可以提高頁面執(zhí)行性能。
上面的例子靜態(tài)的填充列表框的數(shù)據(jù)。如果數(shù)據(jù)庫中的值已經(jīng)發(fā)生了變化,這種方法就不能夠很好的工作。 由于列表框也支持IEnumerable DataSource屬性,所以你可以使用select查詢來動(dòng)態(tài)的填充列表框的值,這樣可以保證數(shù)據(jù)庫和用戶接口總是一致的。下面的例子演示了這個(gè)過程。
在SQL數(shù)據(jù)庫中插入數(shù)據(jù)
為了在數(shù)據(jù)庫中插入一行記錄,你可以在頁面上增加一個(gè)輸入表單,然后在表單提交的事件句柄中執(zhí)行一條插入命令。就像上面兩個(gè)例子一樣,你是用命令對(duì)象的參數(shù)集合填充命令的值。在插入數(shù)據(jù)的之前,注意檢查并確保從表單得到的值不能為空,這樣可以避免數(shù)據(jù)庫字段約束條件的意外錯(cuò)誤。為了防止數(shù)據(jù)表中主索引與欲插入的記錄重復(fù),可以使用try/catch語句塊來執(zhí)行插入命令。
除了明確的檢查輸入數(shù)據(jù)以外,你也可以使用前面章節(jié)提到的驗(yàn)證控件來檢查數(shù)據(jù)輸入。下面的例子向你展示了如何使用做到這一點(diǎn)。注意正則表達(dá)式驗(yàn)證控件在檢查作者id、郵政編碼和電話號(hào)碼等字段時(shí)的方便。
分享:ASP.NET立即上手教程(8)Asp.net引入了一種新的聲明數(shù)據(jù)綁定的語法。這種極其靈活的語法允許開發(fā)者不僅綁定數(shù)據(jù)源,而且可以綁定簡(jiǎn)單的屬性、集合、表達(dá)式、甚至是調(diào)用方法所返回的結(jié)果。下面的列表顯示了這種新語法的
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)
- Asp.Net 無刷新文件上傳并顯示進(jìn)度條的實(shí)現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報(bào)表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(連接字符串的配置及獲取)
- asp.net頁面?zhèn)髦禍y(cè)試實(shí)例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲(chǔ)過程實(shí)現(xiàn)分頁示例代碼
- 相關(guān)鏈接:
- 教程說明:
.Net教程-ASP.NET立即上手教程(9)
。