繁体   English   中英

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

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

我面临的问题是与 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 版

我的猜测是代码有泄漏,任何帮助都被赞成!

您需要一个“使用”块来实现自动连接关闭。 像这样的东西:

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 语句定义了一个范围,在该范围的末尾将处置一个对象。

当代码块执行并完成时,SQLConnection 对象“连接”的处理过程将导致与 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();
        }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM