當使用DataSet時,經常會利用DataAdapter或CommandBuilder進行互動。當使用DataSet時,也可以利用DataView對DataSet中的資料應用排序和篩選。也可以從DataSet繼承,增加強類型DataSet,用於將表、行和列作為強類型對像屬性公開。
所以本文解說使用DataSet或DataReader的最佳時機、如何優化訪問它們所包含資料、以及如何優化使用DataAdapter(包括CommandBuilder)和DataView的技巧。
- 操作來自多個資料源可以是一個XML文件和一個電子錶格的混合資料)的資料。
- 在各層之間交換資料或使用XML Web服務,DataSet能傳遞給遠端客戶端。
- 大量處理每條記錄。對使用DataReader返回的每一行進行擴展處理會延長服務於DataReader的連接的必要時間。
- 使用XML操作對資料進行操作,例如可擴展樣式表語言轉換(XSLT轉換)或XPath查詢。
- 重用同樣的記錄集合,以便通過快取獲得性能改善。
應用程式中使用DataReader:
- 不需要快取資料。
- 要處理的結果集太大,內存中放不下。
- 一旦需要以僅向前、只讀方式快速訪問資料。
以下是C#使用ADO.NET的範例:
public void
RunSqlTransaction(SqlDataAdapter da, SqlConnection myConnection, DataSet ds)
{
myConnection.Open();
SqlTransaction myTrans = myConnection.BeginTransaction();
myCommand.Transaction = myTrans;
try
{
da.Update(ds);
myCommand.Transaction.Commit();
Console.WriteLine("Update successful.");
}
catch (Exception e)
{
try
{
myTrans.Rollback();
}
catch (SqlException ex)
{
if (myTrans.Connection != null)
{
Console.WriteLine("An exception of type " + ex.GetType() + " was encountered while
attempting to roll back the transaction.");
}
}
Console.WriteLine(e.ToString());
Console.WriteLine("Update failed.");
}
myConnection.Close();
}
用DataAdapter優化連接
DataAdapter的Fill和Update方法在連接關閉的情況下自動打開為相關命令屬性指定的連接。如果Fill或Update方法打開了連接,Fill或Update將在操作完成的時候關閉它。為了獲得最佳性能,僅在需要時將與資料庫的連接保持為打開。同時,減少打開和關閉多操作連接的次數。
如果只執行單個的Fill或Update方法調用,建議允許Fill或Update方法隱式打開和關閉連接。如果對Fill和Update調用有很多,建議顯式打開連接,調用Fill和Update,然後顯式關閉連接。
另外,當執行事務時,顯式地在開始事務之前打開連接,並在提交之後關閉連接。
始終關閉Connection和DataReader
完成對Connection或DataReader對象的使用後,總是顯式地關閉它們。儘管垃圾回收最終會清除對象並因此釋放連接和其他托管資源,但垃圾回收僅在需要時執行。因此,確保任何寶貴的資源被顯式釋放仍然是您的責任。並且,沒有顯式關閉的Connections可能不會返回到池中。例如,一個超出作用範圍卻沒有顯式關閉的連接,只有當連接池大小達到最大並且連接仍然有效時,才會被返回到連接池中。
注不要在類的Finalize方法中對Connection、DataReader或任何其他托管對像調用Close或Dispose。最後完成的時候,僅釋放類自己直接擁有的非托管資源。如果類沒有任何非托管資源,就不要在類定義中包含Finalize方法。
在C#中使用「Using」語句
對於C#程式員來說,確保始終關閉Connection和DataReader對象的一個方便的方法就是使用using語句。using語句在離開自己的作用範圍時,會自動調用被「使用」的對象的Dispose。
-雲遊山水為知已逍遙一生而忘齡- 電腦神手
-雲遊山水為知已逍遙一生而忘齡- 電腦神手
沒有留言:
張貼留言