包含无法正确关闭SQL连接的C#代码(可能)

时间:2019-12-01 01:46:19

标签: c# iis sql-server-2014 connection-string connection-pooling

我遇到的问题是无法正确关闭与我们的SQL Server的连接。我可以使用sp_who2或sp_who观察打开的连接(正在睡眠)。我对服务器进行了一些WEB呼叫,可以看到连接数量正在增加。在一定数量的连接下,我确实遇到了超时。 我所称的网站只有以下代码(混淆)可以打开与SQL Server的连接:

    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将照常响应。

一些详细信息: Microsoft SQL Server 2014(SP3-CU4)(KB4500181) IIS版本6.2

我的猜测是代码有漏洞,任何帮助都被剥夺了!

1 个答案:

答案 0 :(得分:3)

您需要一个“ 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();
                }

连接不仅仅因为您离开了函数作用域而关闭。关键是失去功能的作用域不会自动处理对象。但是,当阻塞范围完成时,“使用”命令确实会自动处置该对象。来自Microsoft documentation

  

using语句定义一个范围,对象将在该范围的末尾   被处置。

执行并完成代码块后,SQLConnection对象“连接”的处置过程将导致与数据库的关闭连接。

尝试这种格式:

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();
        }
}