c# - 管理 SQL Server 连接

标签 c# .net sql-server connection-pooling sqlconnection

SQL 连接的最佳实践是什么?

目前我使用的是:

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

我读到过这是一种非常有效的 SQL 连接方式。默认情况下,SQL 池是事件的,所以我的理解是,当 using 代码结束时,SqlConnection 对象被关闭并释放,但与数据库的实际连接被放置在 SQL 连接池中。我错了吗?

最佳答案

这就是大部分内容。需要考虑的一些额外要点:

  • 您从哪里获得连接字符串?您不希望到处都是硬编码,您可能需要对其进行保护。
  • 在真正使用连接之前,您通常还需要创建其他对象(SqlCommandSqlParameterDataSetSqlDataAdapter ),并且您想尽可能长时间地等待以打开连接。完整模式需要考虑到这一点。
  • 您想确保您的数据库访问被强制进入它自己的数据层类或程序集。所以一个常见的做法是将其表达为私有(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;
            }
        }
    }
}

请注意,我还能够“堆叠”cncmd 对象的创建,从而减少嵌套并只创建一个作用域 block 。

最后,请注意在此特定示例中使用 yield return 代码。如果您调用该方法但没有立即完成您的 DataBinding 或其他用途,它可能会使连接保持打开状态很长时间。这方面的一个示例是使用它在 ASP.NET 页面的 Load 事件中设置数据源。由于实际的数据绑定(bind)事件要到稍后才会发生,因此您可以使连接保持打开状态的时间比需要的时间长得多。

关于c# - 管理 SQL Server 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/911786/

相关文章:

c# - .NET Core 应用程序中的 ConfigurationManager

.net - TcpClient - 如何确定何时传送字节?

C# 创建指示属性调用后运行代码的属性

c# - 以编程方式运行 MSBuild 任务并访问输出

sql - 在SQL Server Management Studio中获取调试输出

sql - 在 SQL 中获取 ROWCOUNT 值(不是 @@ROWCOUNT)

sql - 无限期执行 select 语句的存储过程

c# - 如何从 PHP 向 C# 服务发送通知?

c# - ZipPackage 类与 Zipfile 类

c# - 如果一段时间后值发生变化,则使用 WebDriverWait 等待