推薦:ASP.NET立即上手教程(7)Web Forms 用戶控件用戶控件介紹除了ASP.NET提供的內建的服務器控件外,你還可以使用已經掌握的制作WEB FORMS 頁面的技術,輕松的定義自己的控件。實際上,只需要稍微改動一下,幾乎任何W
服務器端數據介紹
數據訪問是現實世界中應用程序的核心內容。Asp.net提供了一套豐富的控件,他與CLR(通用語言運行庫)提供的用來管理數據訪問的APIs(應用程序接口)緊密結合。本章預排幾個反復使用asp.net的DateGrid控件來綁定SQL查詢結果和XML數據文件的例子。本章假定學習者熟悉數據庫基礎和SQL查詢語言。
Wincheer注:預排(walk through)這個詞不知道該怎樣準確翻譯,他的意思是在計算機程序設計中,在一個小組內進行有組織的討論,以便對計算機程序的邏輯進行跟蹤檢查的一個過程。
服務器端數據訪問比較獨特,其原因在于web頁面是無態的。這就導致在試圖執行事務,如插入或者更新記錄的時候,出現了一些有難度的挑戰。正如你將在本章看到的,DataGrid控件能夠幫助管理這些挑戰,允許你濃縮更多的應用程序邏輯,并且減少事件處理和狀態管理的細節。
Connections(連接)、Commands(命令)、和Datasets(數據集)
通用語言運行時刻(CLR)提供了一整套管理數據訪問的APIs,用來增強數據應用程序開發環境。這些應用程序接口用一致的方式來取得和填充數據,而不管實際的數據源是什么(SQL Server, OLEDB, XML,等等)最常用的三個對象是connections, commands, 和 datasets.
Connection 表示到數據存儲的物理連接,例如連接SQL Server 或者 XML文件。
Command 表示取得(select)或者操作(insert, update, delete)數據存儲的命令。
Dataset 表示應用程序用以工作的實際數據。注意datasets 總是與他們的數據源連接和數據模型分離,并且可以被獨立修改。 不過,對dataset進行修改,可以很容易的與原始數據模型協調一致。
關于在通用語言運行時刻管理數據訪問的更多細節問題,請參閱ADO.NET概述。
訪問基于SQL的數據
應用程序常常需要對SQL數據庫執行一個或多個select, insert, update, 或者delete 語句。下面的表格展示了一些實現這些功能的示例代碼。
| 以下為引用的內容: 功能 舉例 ------------------------------------------------------------------ 簡單查詢 | SELECT * from Employees WHERE FirstName = 'Bradley'; ------------------------------------------------------------------ 聯合查詢 | 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數據庫,必須在頁面中引入System.Data 和 System.Data.SqlClient名稱空間:
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
為了從SQL數據庫執行select查詢,你需要通過連接字符串建立一個連接到數據庫的SqlConnection對象, 然后構造一個包含查詢語句的SqlDataAdapter對象。為了用查詢的返回結果填充到DataSet 對象,需要調用SqlDataAdapter的Fill方法。
| 以下為引用的內容: 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的好處在于提供了一個分離的數據庫視圖。你可以在應用程序中操作dataset,然后將你的修改與實際的數據庫一致。對于長時間運行的應用程序來說,由于避免了頻繁的讀取數據源,因而是最好的處理辦法。對于web應用程序來說,往往使用簡短的操作(通常只是簡單的顯示數據)來處理客戶端的請求。在這種情況下,我們就可以使用SqlDataReader來代替DataSet對象。
SqlDataReader對象提供了一種從sql數據庫取得數據時,只向前,只讀的指針。由于SqlDataReader對象使用表格式數據流(TDS)直接從數據庫連接讀取數據,所以,在允許使用的情況下,他的執行效率高于DataSet。
使用SqlDataReader對象的時候,需要使用SqlCommand來代替SqlDataAdapter。SqlCommand 使用 ExecuteReader 方法得到SqlDataReader對象。注意在使用SqlCommand的時候,必須顯式地打開和關閉SqlConnection。調用ExecuteReader方法之后,SqlDataReader對象就可以作為數據源綁定到ASP.NET服務器控件了。下一個小節將會演示這種情況。
| 以下為引用的內容: 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(); |
當執行一條不需要返回數據的SQL命令,如inserts, updates, 和 deletes,也使用SqlCommand。該命令通過調用ExecuteNonQuery方法來執行,返回實際處理的行數。注意使用SqlCommand的時候,必須顯式的打開連接;而SqlDataAdapter則自動的打開連接。
| 以下為引用的內容: 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(); |
重要提示:頁面執行完畢之后,記得務必將數據模型的連接關閉。否則的話,當等待垃圾回收功能處理頁面實例的時候,可能在不經意間就消耗盡連接數限制。
將SQL數據綁定到DataGrid
下面的例子展示了將一個簡單的查詢語句綁定到DataGrid 控件。DataGrid 交付了一個包含sql數據的表。
類似數據綁定那一章提到的DropDownList, DataGrid 控件支持Ienumerable或者 Icollection 類型的DataSource屬性,就如同DataSet一樣。你可以通過將(包含在DataSet中的)表的DefaultView屬性賦值給想使用的(DataSet中的)表的名稱,來使用DataSet控件, DefaultView 屬性表示DataSet中當前表的狀態,包含應用程序代碼所作的任何改變(例如行刪除或者值的改變)。設置了DataSource 屬性以后,可以調用DataBind()來填充控件。
| 以下為引用的內容: MyDataGrid.DataSource=ds.Tables["Authors"].DefaultView; MyDataGrid.DataBind(); |
另一個相同的語法是同時指定DataSource 和DataMember. 在本例中, ASP.NET自動為你獲取了取得了DefaultView。
| 以下為引用的內容: MyDataGrid.DataSource=ds; MyDataGrid.DataMember="Authors"; MyDataGrid.DataBind(); |
你也可以直接綁定到SqlDataReader。如果你僅僅顯示數據,那么SqlDataReader 的"只向前"特性非常適合這種場合,同時你可以得到更高的執行性能。
注意:在本章的剩余部分,我們使用的都是DataSet這種數據訪問模式來演示;實際上,這些例子也同樣可以使用SQLDataReader來重寫。
執行用參數表示的Select命令
你也可以使用SqlDataAdapter對象來執行帶參數的select語句。下面的例子演示如何使用select HtmlControl控件傳遞的值來改變查詢的結果。
SqlDataAdapter 包含Parameters 集合,可以使用變量標識符(名稱前加一個"@") 來代替值。 你可以給這個集合增加一個新的SqlParameter 來指定參數的名稱、類型、和大小,然后設置他的Value屬性的值。
| 以下為引用的內容: myCommand.SelectCommand.Parameters.Add(new SqlParameter("@State", SqlDbType.NVarChar, 2)); myCommand.SelectCommand.Parameters["@State"].Value = MySelect.Value; |
重要提示:注意DataGrid的EnableViewState屬性缺省設置是false。如果在每一次頁面請求時填充數據,就沒有必要讓DataGrid保存表單發送的狀態信息。由于DataGrid保存它包含的所有的狀態的數據,因此將EnableViewState關閉可以提高頁面執行性能。
上面的例子靜態的填充列表框的數據。如果數據庫中的值已經發生了變化,這種方法就不能夠很好的工作。 由于列表框也支持IEnumerable DataSource屬性,所以你可以使用select查詢來動態的填充列表框的值,這樣可以保證數據庫和用戶接口總是一致的。下面的例子演示了這個過程。
在SQL數據庫中插入數據
為了在數據庫中插入一行記錄,你可以在頁面上增加一個輸入表單,然后在表單提交的事件句柄中執行一條插入命令。就像上面兩個例子一樣,你是用命令對象的參數集合填充命令的值。在插入數據的之前,注意檢查并確保從表單得到的值不能為空,這樣可以避免數據庫字段約束條件的意外錯誤。為了防止數據表中主索引與欲插入的記錄重復,可以使用try/catch語句塊來執行插入命令。
除了明確的檢查輸入數據以外,你也可以使用前面章節提到的驗證控件來檢查數據輸入。下面的例子向你展示了如何使用做到這一點。注意正則表達式驗證控件在檢查作者id、郵政編碼和電話號碼等字段時的方便。
分享:ASP.NET立即上手教程(8)Asp.net引入了一種新的聲明數據綁定的語法。這種極其靈活的語法允許開發者不僅綁定數據源,而且可以綁定簡單的屬性、集合、表達式、甚至是調用方法所返回的結果。下面的列表顯示了這種新語法的
新聞熱點
疑難解答
圖片精選