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

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

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; } 

出现InvalidOperationException

您正在尝试打开已打开的连接,这会导致exception。

解决方案1(推荐):

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

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

在行之前

 cmd.Connection.Open(); 

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

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

几乎没有必要将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; }