服務器端數據訪問
服務器端數據介紹 連接、命令和數據集 訪問基于 SQL 的數據 將 SQL 數據綁定到 DataGrid 執行參數化選擇 在 SQL 數據庫中插入數據 更新 SQL 數據庫中的數據 刪除 SQL 數據庫中的數據 將 SQL 數據庫中的數據排序 處理主-從關系 編寫和使用存儲過程 訪問基于 XML 的數據 本節小結
服務器端數據介紹 數據訪問是任何實際應用程序的核心部分,而 ASP.NET 提供了一套豐富的控件,這些控件與公共語言運行庫中提供的托管數據訪問 API 很好地集成在一起。 本節多次演練同一個示例,該示例使用 ASP.NET DataGrid 控件綁定到 SQL 查詢的結果和 XML 數據文件。 本節假定您熟悉數據庫基礎知識和 SQL 查詢語言。 服務器端數據訪問很獨特,因為 Web 頁基本上是無狀態的。當試圖執行事務時,如插入或更新從數據庫檢索的數據集中的記錄時,這向我們提出了某些困難的挑戰。 正如將在本節中看到的,DataGrid 控件可以幫助應付這些挑戰,使您得以更多地集中在應用程序邏輯上,對狀態管理和事件處理的具體細節則不用考慮太多。
連接、命令和數據集 公共語言運行庫為數據密集的應用程序開發提供了完整的托管數據訪問 API 集。 這些 API 幫助抽象數據并用一致的方法表示數據,與實際的數據源(SQL Server、OLEDB、XML 等)無關。 最常使用的對象基本上有三種:連接、命令和數據集。 連接表示與某些數據存儲區(如 SQL Server 或 XML 文件)的物理連接。 命令表示從數據存儲區檢索(選擇)或對數據存儲區進行操作(插入、更新、刪除)的指令。 數據集表示應用程序使用的實際數據。 注意,數據集總是同它們的源連接和數據模型斷開并可獨立修改。 不過,數據集的更改可以很容易與起始數據模型相協調。 有關公共語言運行庫中托管數據訪問解決方案的更詳細演練,請閱讀本教程的 ADO.NET 概述一節。
訪問基于 SQL 的數據 應用程序一般需要對 SQL 數據庫執行一個或多個選擇、插入、更新或刪除查詢。 下表顯示上述每個查詢的示例。
查詢 示例 簡單選擇 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 數據庫執行選擇查詢,請創建與數據庫的 SqlConnection,傳遞連接字符串,然后構造包含查詢語句的 SqlDataAdapter 對象。 若要用查詢結果填充 DataSet 對象,請調用命令的 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"); Dim myConnection As New SqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes") Dim myCommand As New SqlDataAdapter("select * from Authors", myConnection) Dim ds As New DataSet() myCommand.Fill(ds, "Authors") var myConnection:SqlConnection = new SqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes"); var myCommand:SqlDataAdapter = new SqlDataAdapter("select * from Authors", myConnection); var ds:DataSet = new DataSet(); myCommand.Fill(ds, "Authors"); 正如本節前面所提到的,使用數據集的好處是它為您提供了斷開連接的數據庫視圖。 可以在應用程序中操作數據集,然后在以后協調更改和實際的數據庫。 對于長期運行的應用程序,這通常是最好的方法。 對于 Web 應用程序,通常對每個請求執行短操作(一般只是顯示數據)。 通常不需要在一系列請求間保持 DataSet 對象。 對于這類情況,可以使用 SqlDataReader。 SqlDataReader 對從 SQL 數據庫檢索的數據提供僅向前的只讀指針。 因為 SqlDataReader 使用表格數據流 (TDS) 直接從數據庫連接讀取數據,因此它如果可以用于方案,其執行效率會比 DataSet 高。 若要使用 SqlDataReader,請聲明 SqlCommand 而不是 SqlDataAdapter。 SqlCommand 公開返回 SqlDataReader 的 ExecuteReader 方法。 還請注意,當使用 SqlCommand 時,必須顯式打開和關閉 SqlConnection。 調用 ExecuteReader 后,SqlDataReader 可以綁定到 ASP.NET 服務器控件,正如將在下一節看到的。 <Tab Name="C#"> 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(); </Tab>
<Tab Name="VB"> Dim myConnection As SqlConnection = New SqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes") Dim myCommand As SqlCommand = New SqlCommand("select * from Authors", myConnection)
myConnection.Open()
Dim dr As SqlDataReader = myCommand.ExecuteReader()
...
myConnection.Close() </Tab>
<Tab Name="JScript"> var myConnection:SqlConnection = new SqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes"); var myCommand:SqlCommand = new SqlCommand("select * from Authors", myConnection);
myConnection.Open();
var dr : SqlDataReader; dr = myCommand.ExecuteReader();
...
myConnection.Close(); </Tab> 當執行不要求返回數據的命令(如插入、更新和刪除)時,也使用 SqlCommand。 該命令通過調用 ExecuteNonQuery 方法發出,而此方法返回受影響的行數。 注意當使用 SqlCommand 時,必須顯式打開連接;SqlDataAdapter 自動為您處理如何打開連接。 <Tab Name="C#"> 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(); </Tab>
<Tab Name="VB"> Dim myConnection As New SqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes") Dim myCommand As New SqlCommand( _ "UPDATE Authors SET phone='(800) 555-5555' WHERE au_id = '123-45-6789'", _ myConnection)
myCommand.Connection.Open() myCommand.ExecuteNonQuery() myCommand.Connection.Close() </Tab>
<Tab Name="JScript"> var myConnection:SqlConnection = new SqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes"); var myCommand:SqlCommand = new SqlCommand( "UPDATE Authors SET phone='(800) 555-5555' WHERE au_id = '123-45-6789'", myConnection);
myCommand.Connection.Open(); myCommand.ExecuteNonQuery(); myCommand.Connection.Close(); </Tab>
重要說明:始終記住在頁完成執行之前關閉與數據模型的連接。 如果不關閉連接,則可能會在等待頁實例被垃圾回收處理期間不經意地超過連接限制。
將 SQL 數據綁定到 DataGrid 下面的示例顯示一個綁定到 DataGrid 控件的簡單選擇查詢。 DataGrid 呈現包含 SQL 數據的表。
|