2009-05-26 106 views
6

SQL連接的最佳實踐是什麼?管理SQL Server連接

目前我使用如下:

using (SqlConnection sqlConn = new SqlConnection(CONNECTIONSTRING)) 
{ 
    sqlConn.Open(); 
    // DB CODE GOES HERE 
} 

我已閱讀,這是做SQL連接的一個非常有效的方法。默認情況下,SQL池是活動的,所以我的理解是,當using代碼結束時,SqlConnection對象被關閉並放置,但與數據庫的實際連接放置在SQL連接池中。我錯了嗎?

回答

13

這是最重要的。需要考慮的一些其他要點:

  • 你從哪裏得到連接字符串?你不需要那個硬編碼的地方,你可能需要保護它。
  • 你經常有其他的對象來創建,以及你真正使用的連接(SqlCommandSqlParameterDataSetSqlDataAdapter)之前,和你想盡可能長的時間等待打開連接。完整的模式需要考慮到這一點。
  • 你想確保你的數據庫訪問被強制到它自己的數據層類或程序集中。因此,常見的做法是將其表示爲私人函數調用:

private static string connectionString = "load from encrypted config file"; 
private SqlConnection getConnection() 
{ 
    return new SqlConnection(connectionString); 
} 

,然後寫你的樣品是這樣的:

using (SqlConnection sqlConn = getConnection()) 
{ 
    // create command and add parameters 

    // open the connection 
    sqlConn.Open(); 

    // run the command 
} 

那樣品只能在你的數據訪問類存在。另一種方法是將其標記爲internal並將數據層分佈在整個組件上。最主要的是嚴格執行數據庫代碼的清晰分離。

真正的實現可能是這樣的:

public IEnumerable<IDataRecord> GetSomeData(string filter) 
{ 
    string sql = "SELECT * FROM [SomeTable] WHERE [SomeColumn] LIKE @Filter + '%'"; 

    using (SqlConnection cn = getConnection()) 
    using (SqlCommand cmd = new SqlCommand(sql, cn)) 
    { 
     cmd.Parameters.Add("@Filter", SqlDbType.NVarChar, 255).Value = filter; 
     cn.Open(); 

     using (IDataReader rdr = cmd.ExecuteReader()) 
     { 
      while (rdr.Read()) 
      { 
       yield return (IDataRecord)rdr; 
      } 
     } 
    } 
} 

請注意,我也能「堆」創建cncmd的對象,從而減少嵌套,只有創造一個範圍塊。

最後,在此特定示例中使用yield return代碼時要謹慎。如果您打電話給該方法,並且沒有立即完成您的DataBinding或其他使用,它可能會使連接長時間處於打開狀態。其中的一個示例是使用它在ASP.NET頁面的Load事件中設置數據源。由於實際的數據綁定事件直到後來纔會發生,因此可以將連接打開得比所需時間長得多。

1

您對使用的理解是正確的,使用方法是推薦的方式。您也可以在代碼中調用close。

+1

謝謝。我明白,當「使用」完成時,並調用SqlConnection.Dispose();最終通過調用SqlConnection.Close() – Neale 2009-05-26 17:22:15

+0

您對「使用」的理解也是正確的。 – 2009-05-26 17:25:47

2

微軟的Patterns and Practices庫是處理數據庫連接的好方法。這些庫封裝了打開連接所涉及的大部分機制,這反過來會讓您的生活更輕鬆。

0

另外:遲到,早關閉。

在調用數據庫之前沒有更多的步驟之前,不要打開連接。完成後關閉連接。