[英]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.