這是最重要的。需要考慮的一些其他要點:
- 你從哪裏得到連接字符串?你不需要那個硬編碼的地方,你可能需要保護它。
- 你經常有其他的對象來創建,以及你真正使用的連接(
SqlCommand
,SqlParameter
,DataSet
,SqlDataAdapter
)之前,和你想盡可能長的時間等待打開連接。完整的模式需要考慮到這一點。
- 你想確保你的數據庫訪問被強制到它自己的數據層類或程序集中。因此,常見的做法是將其表示爲私人函數調用:
。
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;
}
}
}
}
請注意,我也能「堆」創建cn
和cmd
的對象,從而減少嵌套,只有創造一個範圍塊。
最後,在此特定示例中使用yield return
代碼時要謹慎。如果您打電話給該方法,並且沒有立即完成您的DataBinding
或其他使用,它可能會使連接長時間處於打開狀態。其中的一個示例是使用它在ASP.NET頁面的Load
事件中設置數據源。由於實際的數據綁定事件直到後來纔會發生,因此可以將連接打開得比所需時間長得多。
謝謝。我明白,當「使用」完成時,並調用SqlConnection.Dispose();最終通過調用SqlConnection.Close() – Neale 2009-05-26 17:22:15
您對「使用」的理解也是正確的。 – 2009-05-26 17:25:47