SQL连接的最佳做法是什么?
目前我正在使用以下内容:
using (SqlConnection sqlConn = new SqlConnection(CONNECTIONSTRING))
{
sqlConn.Open();
// DB CODE GOES HERE
}
我已经读过这是一种非常有效的SQL连接方式。默认情况下,SQL池是活动的,所以我理解的是,当using
代码结束时,SqlConnection
对象被关闭并处理,但是与DB的实际连接被放入SQL连接池中。我错了吗?
答案 0 :(得分:14)
这就是大部分内容。还需要考虑一些其他要点:
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
事件中设置数据源。由于实际的数据绑定事件直到以后才会发生,因此您可以将连接打开的时间比需要的时间长得多。
答案 1 :(得分:2)
Microsoft的Patterns and Practices库是处理数据库连接的绝佳方法。这些库封装了打开连接所涉及的大部分机制,这反过来又会让您的生活更轻松。
答案 2 :(得分:1)
您对使用的理解是正确的,并且建议使用该方法。您也可以在代码中调用close。
答案 3 :(得分:0)
另外:开放得很晚,很早就关闭。
在调用数据库之前没有剩下的步骤之前,请不要打开连接。完成后立即关闭连接。