我有以下脚本从数据库中获取一些数据,然后将其删除:
public void checkDB()
{
string query = "SELECT * FROM dbt";
SqlCommand sqlCommand = new SqlCommand(query, conn);
SqlDataReader reader;
int id = -1;
using (reader = sqlCommand.ExecuteReader())
{
if (reader.Read())
{
String data= reader["sdata"].ToString();
Order o = new Order(reader["sdata"].ToString());
o.prepareForScript();
id = reader.GetSqlInt32(1).Value;
}
reader.Close();
}
if (id != -1)
{
string removeQuery = "DELETE FROM data WHERE ID=" + id;
SqlCommand removeCMD = new SqlCommand(removeQuery, conn);
removeCMD.ExecuteNonQuery();
}
}
此代码导致异常
System.Data.dll中发生未处理的“System.InvalidOperationException”类型异常
显示读者已与此连接关联的附加信息。然而,正如您所看到的那样,阅读器既关闭又在使用循环内部,这意味着它应该绝对关闭。有谁知道如何解决这个问题?
答案 0 :(得分:4)
您需要先处理using (SqlCommand sqlCommand = new SqlCommand(query, conn))
{
SqlDataReader reader;
int id = -1;
using (reader = sqlCommand.ExecuteReader())
{
if (reader.Read())
{
String data= reader["sdata"].ToString();
Order o = new Order(reader["sdata"].ToString());
o.prepareForScript();
id = reader.GetSqlInt32(1).Value;
}
reader.Close();
}
}
,如下所示:
MultipleActiveResultSets
或者
启用Sql Injection
。这样,SQL Server允许在单个连接上使用多个开放数据读取器。
但我建议不要一起使用你的SQL语句来避免my_method(20, nil, false)
。