C# 中 Opening/Closing SqlConnection 的最佳方法是什么

What is Best Approach for Opening/Closing SqlConnection in C#

我想知道用 Sql Server 2008R2 Express Edition 数据库打开 SqlConnection 的最佳方法是什么。此版本的 Sql 具有 RAM 使用和 CPU 使用的限制,因此我们必须采用最佳方式打开 SqlConnection

现在我正在检查每个方法的开始和结束时的连接。这是一个例子。

   private void CheckValidId(string Id)
    {
        CheckConnectionStatus();

        try
        {
            sqlConnection.Open();
            sqlCommand = new SqlCommand("select * from ValidId where id=@id", sqlConnection);
            sqlCommand.Parameters.AddWithValue("@id", Id);
            sqlDataReader = sqlCommand.ExecuteReader();
            While (sqlDataReader.Read())
            {
               string Test = sqlDataReader["Id"].toString();
               MessageBox.Show("Value of Id : " , Test);
            }
        }
        catch (Exception exp)
        {
            MessageBox.Show(exp.Message.ToString(), "Exception in CheckValidId");
        }
        finally
        {
            CheckConnectionStatus();
        }
    }

这里是CheckConnectionStatus方法

    private void CheckConnectionStatus()
    {
        if (sqlConnection.State == ConnectionState.Open)
        {
            sqlConnection.Close();
        }
    }

执行此操作的最佳方法是什么。

谢谢

只需使用 using,因为它会在完成后处理连接。

 using(SqlConnection conn = new SqlConnection("Connection string")){
  //do sql stuff
  conn.Open(); 
  //etc etc
  conn.Close();
 }

您需要使用一次性模式来确保所有物品都已关闭并妥善处理:

var query = "select * from ValidId where id=@id";

using (var conn = new System.Data.SqlClient.SqlConnection(usingConnectionString))
using (var command = new System.Data.SqlClient.SqlCommand(query, conn))
{
    command.Parameters.Add("@id", SqlDbType.Int).Value = Id;
    conn.Open;

    using (var reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            string Test = reader["Id"].ToString();
        }
    }

    command.Parameters.Clear();
}

您不需要检查连接状态;它会在处理时关闭。

需要注意一件事:明确指定参数数据类型是最佳做法。我假设你的情况是 SqlDbType.Int,但你可以将其更改为实际情况。

另一件需要注意的事情:您不想在 reader while 循环中做太多事情。你想建立你的 collection 或其他什么然后离开那里。您的连接打开的时间越短越好。那是因为您可能对数据库中的某些行持有读取锁定,这可能会影响其他用户及其应用程序。

您打开和关闭的模式是正确的。但是你必须注意,这不会打开和关闭与 SQL 服务器的连接,因此并不能真正解决你对内存使用和 CPU 的担忧 - 事实上它不会有任何区别。

Open 和 Close 所做的是租用和 return 连接到客户端 PC 上的 ADO 连接池。这意味着 Closing an ADO connection 不能保证(并且在大多数情况下不会)关闭和释放与 SQL 服务器的连接。这是因为建立和验证连接相对昂贵且缓慢,因此 ADO 连接池将您的连接保存在一个池中,仍然打开,以防您想要重新建立连接。

与 SQL 服务器不同的是它需要执行的并发查询的数量 - 以及查询的数据集大小,以及数据库中数据的总大小。

并发查询挤压 CPU,数据集 return 挤压可用 RAM。显然,您的数据库越大,在 RAM 中缓存的内容就越少,因此您在查询时获得缓存命中的可能性就越小。

在实践中,我对 SQL Express 版本的体验是,除非你正在做一些非常具体的事情,否则你不会注意到它与完整版本 SQL Server 之间的任何区别;

1) 编写一个 BI 风格的工具,允许用户构建用户定义的或用户范围的查询。 2) 写糟糕的 SQL - "big SQL" 可能会掩盖你糟糕的查询语法,但 Express 不能,因为它的可用 RAM 较少。

如果您编写高效、受限的 SQL,您实际上可能永远不会遇到任何 SQL Express 的限制。