服務器端數據介紹
數據訪問是現實世界中應用程序的核心內容。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、郵政編碼和電話號碼等字段時的方便。
新聞熱點
疑難解答
圖片精選