ASP.NET立即上手教程(9)

來源:互聯網
上載者:User

伺服器端資料介紹

資料訪問是現實世界中應用程式的核心內容。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語句塊來執行插入命令。

除了明確的檢查輸入資料以外,你也可以使用前面章節提到的驗證控制項來檢查資料輸入。下面的例子向你展示了如何使用做到這一點。注意Regex驗證控制項在檢查作者id、郵遞區號和電話號碼等欄位時的方便。



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.