直播中
連接、命令和數(shù)據(jù)集
公共語言運(yùn)行庫為數(shù)據(jù)密集的應(yīng)用程序開發(fā)提供了完整的托管數(shù)據(jù)訪問 API 集。 這些 API 幫助抽象數(shù)據(jù)并用一致的方法表示數(shù)據(jù),與實(shí)際的數(shù)據(jù)源(SQL Server、OLEDB、XML 等)無關(guān)。 最常使用的對象基本上有三種:連接、命令和數(shù)據(jù)集。
連接表示與某些數(shù)據(jù)存儲區(qū)(如 SQL Server 或 XML 文件)的物理連接。
命令表示從數(shù)據(jù)存儲區(qū)檢索(選擇)或?qū)?shù)據(jù)存儲區(qū)進(jìn)行操作(插入、更新、刪除)的指令。
數(shù)據(jù)集表示應(yīng)用程序使用的實(shí)際數(shù)據(jù)。 注意,數(shù)據(jù)集總是同它們的源連接和數(shù)據(jù)模型斷開并可獨(dú)立修改。 不過,數(shù)據(jù)集的更改可以很容易與起始數(shù)據(jù)模型相協(xié)調(diào)。
有關(guān)公共語言運(yùn)行庫中托管數(shù)據(jù)訪問解決方案的更詳細(xì)演練,請閱讀本教程的 ADO.NET 概述一節(jié)。
訪問基于 SQL 的數(shù)據(jù)
應(yīng)用程序一般需要對 SQL 數(shù)據(jù)庫執(zhí)行一個(gè)或多個(gè)選擇、插入、更新或刪除查詢。 下表顯示上述每個(gè)查詢的示例。
查詢
示例
簡單選擇
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;
為了使頁能夠訪問執(zhí)行 SQL 數(shù)據(jù)訪問所需的類,必須將 System.Data 和 System.Data.SqlClient 命名空間導(dǎo)入到頁中。
<%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.SqlClient" %>
若要對 SQL 數(shù)據(jù)庫執(zhí)行選擇查詢,請創(chuàng)建與數(shù)據(jù)庫的 SqlConnection,傳遞連接字符串,然后構(gòu)造包含查詢語句的 SqlDataAdapter 對象。 若要用查詢結(jié)果填充 DataSet 對象,請調(diào)用命令的 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");
正如本節(jié)前面所提到的,使用數(shù)據(jù)集的好處是它為您提供了斷開連接的數(shù)據(jù)庫視圖。 可以在應(yīng)用程序中操作數(shù)據(jù)集,然后在以后協(xié)調(diào)更改和實(shí)際的數(shù)據(jù)庫。 對于長期運(yùn)行的應(yīng)用程序,這通常是最好的方法。 對于 Web 應(yīng)用程序,通常對每個(gè)請求執(zhí)行短操作(一般只是顯示數(shù)據(jù))。 通常不需要在一系列請求間保持 DataSet 對象。 對于這類情況,可以使用 SqlDataReader。
SqlDataReader 對從 SQL 數(shù)據(jù)庫檢索的數(shù)據(jù)提供僅向前的只讀指針。 因?yàn)?SqlDataReader 使用表格數(shù)據(jù)流 (TDS) 直接從數(shù)據(jù)庫連接讀取數(shù)據(jù),因此它如果可以用于方案,其執(zhí)行效率會(huì)比 DataSet 高。
若要使用 SqlDataReader,請聲明 SqlCommand 而不是 SqlDataAdapter。 SqlCommand 公開返回 SqlDataReader 的 ExecuteReader 方法。 還請注意,當(dāng)使用 SqlCommand 時(shí),必須顯式打開和關(guān)閉 SqlConnection。 調(diào)用 ExecuteReader 后,SqlDataReader 可以綁定到 ASP.NET 服務(wù)器控件,正如將在下一節(jié)看到的。
<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>
當(dāng)執(zhí)行不要求返回?cái)?shù)據(jù)的命令(如插入、更新和刪除)時(shí),也使用 SqlCommand。 該命令通過調(diào)用 ExecuteNonQuery 方法發(fā)出,而此方法返回受影響的行數(shù)。 注意當(dāng)使用 SqlCommand 時(shí),必須顯式打開連接;SqlDataAdapter 自動(dòng)為您處理如何打開連接。
<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>
重要說明:始終記住在頁完成執(zhí)行之前關(guān)閉與數(shù)據(jù)模型的連接。 如果不關(guān)閉連接,則可能會(huì)在等待頁實(shí)例被垃圾回收處理期間不經(jīng)意地超過連接限制。
將 SQL 數(shù)據(jù)綁定到 DataGrid
下面的示例顯示一個(gè)綁定到 DataGrid 控件的簡單選擇查詢。 DataGrid 呈現(xiàn)包含 SQL 數(shù)據(jù)的表。