InvalidOperationException未关闭连接.连接的当前状态是打开的

jp2*_*ode 5 c# t-sql visual-studio-2010

为什么此代码会抛出无效的操作异常?

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;
}
Run Code Online (Sandbox Code Playgroud)

出现InvalidOperationException

Ser*_*sev 7

您正在尝试打开已打开的连接,这会导致异常.

解决方案1(推荐):

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

解决方案2(quick'n'dirty修复):

在排队之前

cmd.Connection.Open();
Run Code Online (Sandbox Code Playgroud)

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

if (cmd.Connection.State == ConnectionState.Open)
{
    cmd.Connection.Close();
}
Run Code Online (Sandbox Code Playgroud)


Aus*_*nen 5

几乎不需要将 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;
}
Run Code Online (Sandbox Code Playgroud)