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.