2013年12月8日 星期日

C# & ADO.NET Basic 運作的基本功

ADO.NET提供以下兩個方法,用於檢索關係資料並將其預存在內存中:DataSet和DataReader。DataSet提供一個內存中資料的關係表示形式,一整套包括一些表在內的資料(這些表包含資料、對資料進行排序並約束資料),以及表之間的關係。DataReader提供一個來自資料庫的快速、僅向前、只讀資料流。

當使用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。

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

沒有留言:

張貼留言