Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中打开/关闭SqlConnection的最佳方法是什么#_C#_Sql Server_Sql Server 2008 R2_Database Connection_Sql Server 2008r2 Express - Fatal编程技术网

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

C# 在C中打开/关闭SqlConnection的最佳方法是什么#,c#,sql-server,sql-server-2008-r2,database-connection,sql-server-2008r2-express,C#,Sql Server,Sql Server 2008 R2,Database Connection,Sql Server 2008r2 Express,我想知道使用SQLServer2008R2 Express Edition数据库打开SqlConnection的最佳方法是什么。这个版本的Sql有RAM使用和CPU使用的限制,所以我们必须采用最好的方法来打开SqlConnection 现在我正在检查每个方法的开始和结束的连接。这里有一个例子 private void CheckValidId(string Id) { CheckConnectionStatus(); try {

我想知道使用
SQLServer2008R2 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(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
,但您可以将其更改为任何实际值


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

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

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

SQL Server的区别在于它需要执行的并发查询的数量、查询的数据集大小以及数据库中数据的总大小

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

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

1) 编写一个BI风格的工具,允许用户构造用户定义的或用户范围的查询。 2) 编写糟糕的SQL——“大SQL”可能会掩盖糟糕的查询语法,但Express无法做到这一点,因为它的可用RAM较少


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

下面的两个答案对您来说都是正确的答案,您之所以要使用using语句,是因为它是一次性的。它将自动关闭连接,当其completed@SimonPrice感谢Mant除非您在数据适配器上使用Fill()方法自动打开(和关闭)连接,否则必须手动打开连接。在您的示例中,您使用适配器的目的是什么?它似乎没有使用?@DanDef——是的,我为这个问题修改了一个使用数据适配器的代码段;我的错。我不知道ExecuteReader没有打开连接,很高兴知道。@rory.ap使用语句对性能有影响吗?我的意思是,如果我使用Using语句,它将使我的应用程序更快?是关于弹性和正确性。如果您的应用程序在从读卡器读取数据时引发异常,则
using
语句保证在数据块存在之前处置所有可处置数据。感谢您的详细回复。我最多有10个连续运行的查询。几个月以来,我感觉到了性能问题。我认为有些僵局。因为当我重新启动服务器时,一切都会正常。那么您认为这是
快速版本限制的问题吗?。我应该升级到
标准版本
,还是应该重新检查我的C#是否有漏洞?您有10个并发查询,或者10个循环运行的查询?如果它的10个查询在一个循环中运行,那么SQL Express不是您的问题。即使有10个并发查询无休止地运行,我也不希望SQLExpress在这方面有任何问题。重新启动服务器应该没有任何区别。尝试使用所有常规工具(如Windows性能监视器、SQL Server Profiler)查看服务器中发生的情况。感谢Man的建议注意:
conn.Close()
是可选的,因为当您处理连接时,它将自动关闭连接