📜  已经有一个与此命令关联的打开的 DataReader 必须先关闭 c# (1)

📅  最后修改于: 2023-12-03 15:25:25.067000             🧑  作者: Mango

已经有一个与此命令关联的打开的 DataReader 必须先关闭

在进行数据读取时,若存在一个打开的DataReader对象,则一定要在使用新的DataReader对象之前将其关闭,否则就会出现'已经有一个与此命令关联的打开的 DataReader'的错误提示。

错误示例
using (SqlConnection conn = new SqlConnection(connStr))
{
    conn.Open();
    SqlCommand cmd = new SqlCommand(sql, conn);
    SqlDataReader reader = cmd.ExecuteReader();
    while (reader.Read())
    {
        // do something
    }
    // Error: 已经有一个与此命令关联的打开的 DataReader 必须先关闭
    SqlDataReader reader2 = cmd.ExecuteReader();
    while (reader2.Read())
    {
        // do something
    }
}
解决方案
1.关闭当前DataReader对象

在使用完当前的DataReader对象后,调用Close方法将其关闭。

using (SqlConnection conn = new SqlConnection(connStr))
{
    conn.Open();
    SqlCommand cmd = new SqlCommand(sql, conn);
    SqlDataReader reader = cmd.ExecuteReader();
    while (reader.Read())
    {
        // do something
    }
    reader.Close();
    SqlDataReader reader2 = cmd.ExecuteReader();
    while (reader2.Read())
    {
        // do something
    }
}
2.使用NextResult方法

若需要在同一个SqlCommand对象中执行多个查询,则可以使用NextResult方法跳转到下一个结果集,并在使用完当前结果集后将其关闭。

using (SqlConnection conn = new SqlConnection(connStr))
{
    conn.Open();
    SqlCommand cmd = new SqlCommand(sql, conn);
    SqlDataReader reader = cmd.ExecuteReader();
    while (reader.Read())
    {
        // do something
    }
    reader.NextResult();
    while (reader.Read())
    {
        // do something
    }
    reader.Close();
}
总结

在使用DataReader对象时,一定要注意关闭当前的DataReader对象,或使用NextResult方法跳转到下一个结果集,并在使用完当前结果集后关闭,以避免出现'已经有一个与此命令关联的打开的 DataReader'的错误提示。