2013-07-09 187 views
16

好的,所以這是一種有見地的話題,但是根據你的知識,觀點和當前的實踐,設置下面的場景最好的方法是什麼?C#數據連接最佳實踐?

我建立了廣泛的數據錄入應用程序,並通過廣泛我的意思是,我只掌握了一些基本設置,其中包含周圍15-25%的整體方案,我有大約15多種形式的有部分設置。 (他們仍然需要工作)我使用SQL Compact 4.0作爲我的後端數據庫,我並不需要更大的數據庫,因爲我不存儲MMO的數據,目前這只是本地應用程序。

我希望能夠將其設置爲單個窗口,只是根據菜單系統改變爲各種不同的頁面,但我似乎無法找到一個很好的教程,所以如果有人知道,請賜教。

但是,有問題的場景是如何連接到數據庫。我使用2個SQLCE數據庫,一個存儲基於服務和人員的常量數據,另一個存儲不斷變化的數據或基於第一個數據庫輸入的新數據。我已經看到了很多不同的方法來設置它,目前我正在使用一個其中包含所有其他形式繼承的BaseForm的方法。在BaseForm中,我擁有許多形式通用的方法和變量,從而最大限度地減少了正在重複的代碼量。

這包括連接字符串兩個數據庫,和方法2可打開的,以其中一方的連接。像這樣:

internal SqlCeConnection dataConn = new SqlCeConnection(@"Data Source = |DataDirectory|\opi_data.sdf"); 
internal SqlCeConnection logConn = new SqlCeConnection(@"Data Source = |DataDirectory|\opi_logs.sdf"); 
internal SqlCeCommand command; 

internal void openDataConnection() // Opens a connection to the data tables 
     { 
      try 
      { 
       if(dataConn.State == ConnectionState.Closed) 
        dataConn.Open(); 
      } 
      catch(SqlCeException ex) 
      { 
       MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
     } 

     internal void openLogConnection() // Opens a connection to the log tables 
     { 
      try 
      { 
       if(logConn.State == ConnectionState.Closed) 
        logConn.Open(); 
      } 
      catch (SqlCeException ex) 
      { 
       MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
     } 

然後每當我需要一個開放的連接我簡單地調用對應於我需要訪問數據庫的開放連接方法,然後在最後聲明中關閉它。通過這種方式,連接永遠不會打開很長時間,只是在需要的時候。當然這意味着有很多打開連接方法的調用。那麼這是實施這種場景的最佳方式,還是有更好的方法?

是更好地只想儘快打開連接的形式加載,然後當窗體關閉關閉它?我有多個表單一次打開的實例,每個表單可能需要打開一個到數據庫的連接,所以如果關閉它,那麼其他的就會被搞錯了嗎?還是應該在應用程序啓動時打開兩個數據庫的連接?任何輸入將不勝感激。謝謝。

+1

請在使用聲明中查看此問題http://stackoverflow.com/q/212198/1193596 – Amicable

回答

51

連接由.NET彙集,所以重新創建它們通常不是昂貴的操作。但是,長時間保持連接可能會導致問題。

大多數「最佳實踐」告訴我們,一旦關閉它們儘可能地(數據的最後一位已被提取之後)(右執行任何SQL之前),打開連接儘可能晚。

自動這樣做的一個有效辦法是採用using聲明:

using (SqlConnection conn = new SqlConnection(...)) 
{ 
    using(SqlCommand cmd = new SqlCommand(..., conn)) 
    { 
     conn.Open(); 
     using(DataReader dr = cmd.ExecuteReader()) // or load a DataTable, ExecuteScalar, etc.  
     { 
      ... 
     { 
    } 
} 

這樣一來,關閉資源和配置,即使拋出一個異常的。

簡而言之,在應用程序打開或每個表單打開時打開連接可能不是最佳方法。

+0

謝謝,我一直在考慮在使用語句中添加並刪除打開的連接方法,作爲創建連接的更清潔更有效的方式。只是沒有到處去清理我的代碼。只需使用try/catch方法進行測試即可。 –

-10

我認爲這是最好只打開它們時的應用程序啓動,因爲你從數據庫權需要的東西?我不是這方面的專家,這只是我的意見了......我編程的一些類似的應用,並取得了連接在主窗體的開始處。我創建一個單獨的連接的唯一形式是登錄表單。

+7

請不要發佈推測性答案,實際上有Microsoft建議遵循的最佳做法。 – Mgetz

+0

@Mgetz你是正確的,這是一個猜測,我確信有一些標準應該遵循。從他們身上帶走的重要一點是,僅僅因爲它是一個標準並不能使它適合您的軟件系統。如果這使你的系統更好,它是如何做到的?這將引發更好的討論。我有幾個應用程序,我用開放的數據庫連接編寫,直到完成執行,但有充分的理由。 –