C# 随机行为:;连接没有关闭。连接';的当前状态为“打开”;
这很奇怪,虽然这段代码经常执行,但它只是偶尔发生 我让这段代码每5秒运行一次,效果很好,但有时我会将异常保存在日志中 异常消息:连接未关闭。连接的当前状态为“打开”C# 随机行为:;连接没有关闭。连接';的当前状态为“打开”;,c#,asp.net,sql,asp.net-mvc,exception,C#,Asp.net,Sql,Asp.net Mvc,Exception,这很奇怪,虽然这段代码经常执行,但它只是偶尔发生 我让这段代码每5秒运行一次,效果很好,但有时我会将异常保存在日志中 异常消息:连接未关闭。连接的当前状态为“打开” public class Log { static SqlConnection sqlConnection{get; set;} public Log() { sqlConnection = new SqlConnection(CNN_STRING); } publ
public class Log
{
static SqlConnection sqlConnection{get; set;}
public Log()
{
sqlConnection = new SqlConnection(CNN_STRING);
}
public static void Save(){
StringBuilder sb = new StringBuilder();
sb.Append("UPDATE Blabla SET ...");
SqlCommand command = new SqlCommand(sb.ToString(), sqlConnection);
try
{
if (sqlConnection.State == ConnectionState.Open) { sqlConnection.Close(); }
sqlConnection.Open();
command.ExecuteNonQuery();
sqlConnection.Close();
}catch(Exception e){
Log.AddLog("Log ", 1, string.Concat("Query: ", sb.ToString(),
"Exception message: ", e.Message));
}
finally
{
if (sqlConnection.State == ConnectionState.Open) { sqlConnection.Close(); }
}
}
有什么线索吗?在ASP.NET中使用静态连接不是一个好主意,因为每个请求都会共享此连接,这将导致锁处于最佳状态,甚至出现类似您的错误 也许我前一段时间发的帖子很有帮助。因此,不要将其设置为静态,使用
using
-语句
using(var sqlConnection = new SqlConnection(CNN_STRING))
using (var command = new SqlCommand(sb.ToString(), sqlConnection))
{
sqlConnection.Open();
command.ExecuteNonQuery();
}
您不需要关闭连接,因为这是通过using语句(dispose)完成的。考虑使用来处理
SqlConnection
和SqlCommand
。如果连接已经打开,为什么要关闭它并重新打开它?它不是最快的,而且有成本。当您再次尝试打开连接时,很可能连接仍在关闭。是否显示sqlConnection
的声明,是否为static
?然后把它变成一个局部变量,你就完成了。@TimSchmelter它是静态的,因为这个方法也是静态的,我的意思是,它是一个静态类,有一些静态函数使用ConnectionTank作为链接,现在我必须更改600行代码,因为我将ADO.NET功能封装到了DB helper类中!顺便说一下,“使用”将始终关闭/处理连接,对吗?