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; }
您正在尝试打开已打开的连接,这会导致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; }