SQL 连接的最佳实践是什么?
目前我使用的是:
using (SqlConnection sqlConn = new SqlConnection(CONNECTIONSTRING))
{
sqlConn.Open();
// DB CODE GOES HERE
}
我读到过这是一种非常有效的 SQL 连接方式。默认情况下,SQL 池是事件的,所以我的理解是,当 using
代码结束时,SqlConnection
对象被关闭并释放,但与数据库的实际连接被放置在 SQL 连接池中。我错了吗?
最佳答案
这就是大部分内容。需要考虑的一些额外要点:
- 您从哪里获得连接字符串?您不希望到处都是硬编码,您可能需要对其进行保护。
- 在真正使用连接之前,您通常还需要创建其他对象(
SqlCommand
、SqlParameter
、DataSet
、SqlDataAdapter
),并且您想尽可能长时间地等待以打开连接。完整模式需要考虑到这一点。 - 您想确保您的数据库访问被强制进入它自己的数据层类或程序集。所以一个常见的做法是将其表达为私有(private)函数调用:
.
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
对象的创建,从而减少嵌套并只创建一个作用域 block 。
最后,请注意在此特定示例中使用 yield return
代码。如果您调用该方法但没有立即完成您的 DataBinding
或其他用途,它可能会使连接保持打开状态很长时间。这方面的一个示例是使用它在 ASP.NET 页面的 Load
事件中设置数据源。由于实际的数据绑定(bind)事件要到稍后才会发生,因此您可以使连接保持打开状态的时间比需要的时间长得多。
关于c# - 管理 SQL Server 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/911786/