有一个不能正确关闭 SQL 连接的 c# 代码(可能)

Having a c# code which doesn't close SQL Connection correctly (probably)

我遇到的问题是与 SQL 服务器的连接未正确关闭。我可以使用 sp_who2 或 sp_who 查看打开的连接(休眠)。我对服务器进行了一些 WEB 调用,可以看到连接数在增加。在特定数量的连接下,我 运行 超时。 我调用的网站只有以下代码(混淆)打开与 SQL 服务器的连接:

    private string getsomedetails(string Name, string applicationConnectionString)
{
  string empty = string.Empty;
  SqlCommand sqlCommand = new SqlCommand();
  sqlCommand.Connection = new SqlConnection(applicationConnectionString);
  sqlCommand.CommandText = "SELECT xx FROM dbo.xxx WHERE Name = @xyz";
  sqlCommand.Parameters.AddWithValue("@xyz", (object) Name);
  sqlCommand.Connection.Open();
  return sqlCommand.ExecuteScalar().ToString();
    }

我了解到当连接处于上述块中时,连接将被关闭。但是异常会发生什么?

我的连接字符串如下所示:

      <connectionStrings>
<add name="AssetConnectionString"
     providerName="System.Data.SqlClient"
     connectionString= "server=SERVERNAME; 
                      database=DBNAME; 
                      uid=USERNAME; 
                      pwd=PASSWORD;
                      application name=APPNAME"
   />

我现在的解决方法是回收 IIS 中的应用程序池。之后 API 将照常响应。

一些细节: 微软 SQL 服务器 2014 (SP3-CU4) (KB4500181) IIS 版本 6.2

我的猜测是代码有漏洞,任何帮助都会被点赞!

你需要一个"using"块来实现自动关闭连接。像这样:

using (SqlConnection connection = new SqlConnection(myConnString))
                {
                    connection.Open();
                    SqlCommand cmd = new SqlCommand(fullSQLString, connection);
                    foreach (SqlParameter p in sqlParameters)
                        cmd.Parameters.Add(p);
                    cmd.ExecuteNonQuery();
                }

连接不会因为您离开函数范围而关闭。关键是失去功能范围不会自动处理对象。但是,"using" 命令会在阻塞作用域完成时自动释放对象。来自微软 documentation:

The using statement defines a scope at the end of which an object will be disposed.

当代码块执行完成后,SQLConnection对象的处理过程"connection"将导致与DB的连接关闭。

试试这个格式:

private string getsomedetails(string Name, string applicationConnectionString)
{
     string empty = string.Empty;
     string SQLStr = "SELECT xx FROM dbo.xxx WHERE Name = @xyz";


     using(SqlConnection connection = new SqlConnection(applicationConnectionString))
        {
          connection.Open();
          SqlCommand sqlCommand = new SqlCommand(SQLStr, connection);
          sqlCommand.Parameters.AddWithValue("@xyz", (object) Name);
          return sqlCommand.ExecuteScalar().ToString();
        }
}