什么是在C#中打开/关闭SqlConnection的最佳方法

时间:2016-10-18 20:37:33

标签: c# sql-server sql-server-2008-r2 database-connection sql-server-2008r2-express

我想知道用SqlConnection数据库打开Sql Server 2008R2 Express Edition的最佳方法是什么。此版本的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();
        }
    }

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

由于

3 个答案:

答案 0 :(得分:5)

只需使用using,因为一旦完成就会处理连接。

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

答案 1 :(得分:2)

您希望使用一次性图案以确保一切都关闭并妥善处理:

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,但您可以将其更改为实际情况。

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

答案 2 :(得分:2)

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

Open和Close的作用是租用并返回到客户端PC上ADO连接池的连接。这意味着无法保证关闭ADO连接(并且在大多数情况下不会)关闭并释放与SQL Server的连接。这是因为建立和验证连接相对昂贵且速度慢,因此ADO连接池会将您的连接保持在池中,仍然打开,以防您想要重新建立连接。

SQL Server的不同之处在于它需要执行的并发查询数量 - 以及查询的数据集大小以及数据库中数据的总大小。

并发查询会挤压CPU,并且返回的数据集会挤压可用的RAM。显然,数据库越大,缓存在RAM中的可能性越小,因此查询时获取缓存的可能性就越小。

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

1)编写BI样式工具,允许用户构造用户定义或用户范围的查询。 2)编写可怕的SQL - “大SQL”可能会掩盖您的错误查询语法,但Express无法实现,因为它可用的RAM较少。

如果编写高效的约束SQL,您可能根本不会遇到任何SQL Express的限制。