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)

您正在尝试打开已打开的连接,这会导致异常.
解决方案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)
几乎不需要将 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)
| 归档时间: |
|
| 查看次数: |
17480 次 |
| 最近记录: |