具有C#代码,无法正确关闭SQL连接(可能)

问题描述 投票:0回答:1

我面临与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

我的猜测是代码有漏洞,任何帮助都被投票!

c# iis sql-server-2014 connection-string connection-pooling
1个回答
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();
        }
}
© www.soinside.com 2019 - 2024. All rights reserved.