C# & SQL 服务器:获取数据然后删除 returns 错误
C# & SQL Server : fetch data and then delete returns error
我有以下脚本可以从数据库中获取一些数据,然后将其删除:
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();
}
}
此代码导致异常
unhandled exception of type 'System.InvalidOperationException' occurred in System.Data.dll
附加信息表明 reader 已与此连接相关联。但是,正如您所看到的,reader 既已关闭又在 using 循环内,这意味着它应该明确关闭。有人知道如何解决这个问题吗?
您需要先SqlCommand
如下处理:
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 服务器允许在单个连接上打开多个数据读取器。
但我建议不要同时使用你们的 SQL 语句以避免 Sql Injection
.
我有以下脚本可以从数据库中获取一些数据,然后将其删除:
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();
}
}
此代码导致异常
unhandled exception of type 'System.InvalidOperationException' occurred in System.Data.dll
附加信息表明 reader 已与此连接相关联。但是,正如您所看到的,reader 既已关闭又在 using 循环内,这意味着它应该明确关闭。有人知道如何解决这个问题吗?
您需要先SqlCommand
如下处理:
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 服务器允许在单个连接上打开多个数据读取器。
但我建议不要同时使用你们的 SQL 语句以避免 Sql Injection
.