DataSet與DataReader
當設計應用程序時,要考慮應用程序所需功能的等級,以確定使用DataSet或者是DataReader。
要通過應用程序執行以下操作,就要使用DataSet:
1) 在結果的多個離散表之間進行導航。
2) 操作來自多個數據源(例如,來自多個數據庫、一個XML文件和一個電子表格的混合數據)的數據。
3) 在各層之間交換數據或使用XML Web服務。與DataReader不同的是,DataSet能傳遞給遠程客戶端。
4) 重用同樣的記錄集合,以便通過緩存獲得性能改善(例如排序、搜索或篩選數據)。
5) 每條記錄都需要執行大量處理。對使用DataReader返回的每一行進行擴展處理會延長服務于DataReader的連接的必要時間,這影響了性能。
6) 使用XML操作對數據進行操作,例如可擴展樣式表語言轉換(XSLT轉換)或XPath查詢。
對于下列情況,要在應用程序中使用DataReader:
1) 不需要緩存數據。
2) 要處理的結果集太大,內存中放不下。
3) 一旦需要以僅向前、只讀方式快速訪問數據。
注填充DataSet時,DataAdapter使用DataReader。因此,使用DataAdapter取代DataSet提升的性能表現為節省了DataSet占用內存和填充DataSet需要的循環。一般來說,此性能提升只是象征性的,因此,設計決策應以所需功能為基礎。
使用強類型DataSet的好處
DataSet的另一個好處是可被繼承以創建一個強類型DataSet。強類型DataSet的好處包括設計時類型檢查,以及Microsoft Visual Studio.NET用于強類型DataSet語句結束所帶來的好處。修改了DataSet的架構或關系結構后,就可以創建一個強類型DataSet,將行和列作為對象的屬性公開,而不是作為集合中的項公開。例如,不公開客戶表中行的姓名列,而公開Customer對象的Name屬性。類型化DataSet從DataSet類派生,因此不會犧牲DataSet的任何功能。也就是說,類型化DataSet仍能遠程訪問,并作為數據綁定控件(例如DataGrid)的數據源提供。如果架構事先不可知,仍能受益于通用DataSet的功能,但卻不能受益于強類型DataSet的附加功能。
處理強類型DataSet中的空引用
使用強類型DataSet時,可以使用DataSet的XML架構定義語言(XSD)架構來確保強類型DataSet可以正確處理空引用。nullValue標識符使您可用一個指定的值String.Empty代替DBNull、保留空引用或引發異常。選擇哪個選項取決于應用程序的上下文。默認情況下,如果遇到空引用,就會引發異常。
刷新DataSet中的數據
如果想用服務器上的更新值刷新DataSet中的值,就使用DataAdapter.Fill。如果有在DataTable上定義的主鍵,DataAdapter.Fill會根據主鍵進行新行匹配,并且當更改到現有行時應用服務器上的值。即使刷新之前修改了這些數據,刷新行的RowState仍被設置為Unchanged。注意,如果沒有為DataTable定義主鍵,DataAdapter.Fill就用可能重復的主鍵值添加新行。
如果想用來自服務器的當前值刷新表,并同時保留對表中的行所做的任何更改,必須首先用DataAdapter.Fill填充表,并填充一個新的DataTable,然后用preserveChanges值true將DataTable合并到DataSet之中。
在DataSet中搜索數據
在DataSet中查詢與特定條件相匹配的行時,可以利用基于索引的查找提高搜索性能。當將PrimaryKey值賦給DataTable時,會創建一個索引。當給DataTable創建DataView時,也會創建一個索引。下面是一些利用基于索引進行查找的技巧。
1) 如果對組成DataTable的PrimaryKey的列進行查詢,要使用DataTable.Rows.Find而不是DataTable.Select。
2) 對于涉及到非主鍵列的查詢,可以使用DataView為數據的多個查詢提高性能。當將排序順序應用到DataView時,就會建立一個搜索時使用的索引。DataView公開Find和FindRows方法,以便查詢基礎DataTable中的數據。
新聞熱點
疑難解答