最常使用的對象基本上有三種:串連、命令和資料集。
- 串連表示與某些資料存放區區(如 SQL Server 或 XML 檔案)的物理串連。
- 命令表示從資料存放區區檢索(選擇)或對資料存放區區進行操作(插入、更新、刪除)的指令。
- 資料集表示應用程式使用的實際資料。注意,資料集總是同它們的源串連和資料模型斷開並可獨立
修改。不過,資料集的更改可以很容易與起始資料模型相協調。
使用資料集的好處是它為您提供了中斷連線的資料庫檢視。可以在應用程式中操作資料集,然後在以後協
調更改和實際的資料庫。對於長期啟動並執行應用程式,這通常是最好的方法。對於 Web 應用程式,通常對
每個請求執行短操作(一般只是顯示資料)。通常不需要在一系列請求間保持 DataSet 對象。對於這類
情況,可以使用 SqlDataReader。
SqlDataReader 對從 SQL 資料庫檢索的資料提供僅向前的唯讀指標。若要使用 SqlDataReader,請聲明 SqlCommand 而不是 SqlDataAdapter。SqlCommand 公開返回 SqlDataReader 的 ExecuteReader 方法。還請注意,當使用 SqlCommand 時,必須顯式開啟和關閉 SqlConnection。
重要說明:始終記住在頁完成執行之前關閉與資料模型的串連。如果不關閉串連,則可能會在等待頁執行個體被記憶體回收處理期間不經意地超過串連限制。
Server=(local);中的local,這樣設定可以避免由於伺服器IP地址變更而造成網站不能訪問
常用的資料庫綁定代碼
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, "作者");
MyDataGrid.DataSource=ds.Tables["作者"].DefaultView;
MyDataGrid.DataBind();
當執行不要求返回資料的命令(如插入、更新和刪除)時,也使用 SqlCommand。該命令通過調用 ExecuteNonQuery 方法發出,而該方法返回受影響的行數
DefaultView 屬性工作表示 DataSet 中表的目前狀態,包括應用程式代碼所做的任何更改(例如,行刪除或值更改)。設定了 DataSource 屬性後,調用 DataBind() 填充控制項。
MyDataGrid.DataSource=ds.Tables["Authors"].DefaultView; MyDataGrid.DataBind(); 與MyDataGrid.DataSource=ds; MyDataGrid.DataMember="Authors"; MyDataGrid.DataBind();等效 重要說明: 注意 DataGrid 的 EnableViewState 屬性已設定為 false。如果每個請 求中都要填充資料,讓 DataGrid 儲存將通過往返行程由表單發送來發送的狀態資訊沒有 好處。因為 DataGrid 在維護狀態時儲存其所有資料,適當時將其關閉很重要,這樣可以 提高頁面效能。 執行參數化選擇代碼 String selectCmd = "select * from Authors where state = @State"; SqlConnection myConnection = new SqlConnection("server=(local) \\NetSDK;database=pubs;Trusted_Connection=yes"); SqlDataAdapter myCommand = new SqlDataAdapter(selectCmd, myConnection); myCommand.SelectCommand.Parameters.Add(new SqlParameter ("@State", SqlDbType.NVarChar, 2)); myCommand.SelectCommand.Parameters["@State"].Value = MySelect.Value; DataSet ds = new DataSet(); myCommand.Fill(ds, "作者"); MyDataGrid.DataSource= ds.Tables["作者"].DefaultView; MyDataGrid.DataBind(); |
對任何網格的共同要求是能夠將它包含的資料排序。雖然 DataGrid 控制項不為您顯式排序它的資料,但它確實提供一種方法,在使用者單擊可用來排序資料的列標題時呼叫事件處理常式。當 DataGrid 的 AllowSorting 屬性設定為 true 時,它呈現將 Sort 命令激發回網格的列標題的超級連結。將 DataGrid 的 OnSortCommand 屬性設定為當使用者單擊列連結時要調用的處理常式。列的名稱作為 DataGridSortCommandEventArgs 參數上的 SortExpression 屬性傳遞,該參數可用來設定綁定到網格的 DataView 的 Sort 屬性。下面的樣本說明此過程。
<script> protected void MyDataGrid_Sort(Object Src, DataGridSortCommandEven tArgs E) { ... DataView Source = ds.Tables["Authors"].DefaultView; Source.Sort = E.SortExpression; MyDataGrid.DataBind(); } </script> <form runat="server"> <ASP:DataGrid id="MyDataGrid" OnSortCommand="MyDataGrid_Sort" AllowSorting="true" runat="server" /> </form> <script> Protected Sub MyDataGrid_Sort(Src As Object, E As DataGridSort CommandEventArgs) ... DataView Source = ds.Tables("Authors").DefaultView Source.Sort = E.SortExpression MyDataGrid.DataBind() End Sub </script> <form runat="server"> <ASP:DataGrid id="MyDataGrid" OnSortCommand="MyDataGrid_Sort" AllowSorting="true" runat="server" /> </form> <script> protected function MyDataGrid_Sort(Src:Object, E:DataGridSort CommandEventArgs) : void { ... var Source:DataView = ds.Tables["Authors"].DefaultView; Source.Sort = E.SortExpression; MyDataGrid.DataBind(); } </script> <form runat="server"> <ASP:DataGrid id="MyDataGrid" OnSortCommand="MyDataGrid_Sort" AllowSorting="true" runat="server" /> </form> |
在本節開始已經提到,DataSet 以獨立於實際資料來源的方式被設計為抽象資料。通過將樣本的重點從 SQL 改為 XML,可以明白這一點。DataSet 支援將 FileStream 對象用作參數的 ReadXml 方法。在這種情況
下讀取的檔案必須同時包含希望讀取的架構和資料。
也可以分別讀取資料和架構,使用 DataSet 的 ReadXmlData 和 ReadXmlSchema 方法
- 公用語言運行庫的管理的資料訪問 API 抽象資料並用一致的方式表示它,與實際的資料來源(SQL Server、OLEDB、XML 等)無關。
- 為了使頁能夠訪問執行 SQL 資料訪問所需的類,必須將 System.Data 和 System.Data.SqlClient 命名空間匯入到頁中。
- 從 SQL 查詢填充資料集涉及建立 SqlConnection、將 SqlDataAdapter 對象與包含查詢語句的串連關聯和從命令填充資料集。
- DataGrid 控制項支援採用 IEnumerable(或 ICollection)類型的 DataSource 屬性。通過分配 DataSet 的 DefaultView 屬性(DataView 類型),可以將此設定為 SQL 查詢的結果。
- SqlDataAdapter 維護一個可用於用值替換變數標識符(由名稱前的“@”表示)的 Parameters
集合。
- 當執行不要求返回資料的命令(如插入、更新和刪除)時,使用 SqlCommand,而不是 SqlDataAdapter。該命令通過調用 ExecuteNonQuery 方法發出,而該方法返回受影響的行數。
- 使用 SqlCommand 時必須顯式開啟 SqlConnection(SqlDataAdapter 自動地為您處理開啟串連)。始終記住在頁完成執行前關閉與資料模型的 SqlConnection。如果沒有關閉串連,則可能會在等待頁執行個體被垃圾收集回收時不經意超過串連限制。
- 為了允許對行進行編輯,DataGrid 支援整型 EditItemIndex 屬性,該屬性指示網格的哪一行應該
是可編輯的。設定了該屬性後,DataGrid 按該索引將行呈現為文本輸入框,而不是簡單的標籤。
- DataGrid 公開一個可設定為主鍵欄位名的 DataKeyField 屬性。在連到 UpdateCommand 的事件
處理常式中,可以從 DataGrid 的 DataKeys 集合檢索鍵名。
- 使用 DataGrid 中的 BoundColumn 控制項使您可以完全控制列的順序,以及它們的 ReadOnly 屬性。
- 使用 DataGrid 中的 TemplateColumn 控制項使您可以完全控制列的內容。
- ButtonColumn 控制項可用於在該列的每一行中僅呈現按鈕控制項,而該列可與事件關聯。
- HyperLinkColumn 可以添加到 DataGrid 的 Columns 集合,該集合支援在單擊連結時定位到另一頁。
- 當 DataGrid 的 AllowSorting 屬性設定為 true 時,它呈現將 Sort 命令激發回網格的列標題的
超級連結。將 DataGrid 的 OnSortCommand 屬性設定為當使用者單擊列連結時要調用的處理常式。
- DataSet 支援將 FileStream 作為參數的 ReadXml、ReadXmlData 和 ReadXmlSchema 方法,而該參數可用於從 XML 檔案填充 DataSet。
- 使用預存程序可以減少在應用程式中執行繁重的資料庫操作的開銷。
DataList 和 Repeater 也支援 DataSource 屬性,該屬性(DataSource)可設定為任何 ICollection、IEnumerable 或 IListSource 類型