【问题标题】:InvalidOperationException The connection was not closed. The connection's current state is openInvalidOperationException 连接未关闭。连接的当前状态为打开
【发布时间】:2012-06-18 16:53:56
【问题描述】:

为什么这段代码会抛出无效操作异常?

private SqlCommand cmd; // initialized in the class constructor

public void End(string spSendEventNotificationEmail) {
  try {
    cmd.CommandText = spSendEventNotificationEmail;
    cmd.Parameters.Clear();
    cmd.Parameters.Add("@packetID", SqlDbType.Int).Value = _packetID;
    cmd.Parameters.Add("@statusID", SqlDbType.Int).Value = _statusID;
    cmd.Parameters.Add("@website", SqlDbType.NVarChar, 100).Value = Tools.NextStep;
    cmd.Connection.Open();
    cmd.ExecuteNonQuery();
  } finally {
    cmd.Connection.Close();
    cmd.Parameters.Clear();
    cmd.Dispose();
  }
  endCall = true;
}

【问题讨论】:

  • 也许你以前打开过连接?
  • 我认为问题的根源在于类构造函数初始化的SqlCommand实例。在你的所有代码中都有这个 var 很容易被滥用,并导致代码的其他部分出现令人讨厌的错误

标签: c# visual-studio-2010 tsql


【解决方案1】:

您试图打开一个已经打开的连接,这会导致异常。

解决方案 1(推荐):

检查您的代码,检查打开cmd.Connection 连接的所有部分,并确保它始终正确关闭。

解决方案 2(快速修复):

行前

cmd.Connection.Open();

添加以下检查/清理代码:

if (cmd.Connection.State == ConnectionState.Open)
{
    cmd.Connection.Close();
}

【讨论】:

  • 嘘!怪异的新手错误。
  • 嗯,这可以完成这项工作,但是 OP 代码突出显示 ExecuteNonQuery 行,而不是 Connection.Open
【解决方案2】:

几乎不需要将 Sql* 对象保持在类级别,尤其是根据您所展示的内容。尝试自己进行连接池也将失去连接池的优势。

使用此方法,您消除了出错的可能性,因为您没有共享任何对象

private readonly _connectionString = "...";

public void End(string spSendEventNotificationEmail) {
  using(var conn = new SqlConnection(_connectionString))
  using(var cmd = conn.CreateCommand())
  {
    cmd.CommandText = spSendEventNotificationEmail;
    cmd.Parameters.Add("@packetID", SqlDbType.Int).Value = _packetID;
    cmd.Parameters.Add("@statusID", SqlDbType.Int).Value = _statusID;
    cmd.Parameters.Add("@website", SqlDbType.NVarChar, 100).Value = Tools.NextStep;
    conn.Open();
    cmd.ExecuteNonQuery();
  }
  endCall = true;
}

【讨论】:

  • 我最初以这种方式创建它的唯一原因是,来自单个请求的多个部件号可以共享同一个事务。不过,我找到了一种更好的方法,所以我可以(可能应该)放弃这种旧方法。谢谢。
猜你喜欢
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多