重新打开SqlDataReader

本文关键字:SqlDataReader 新打开 | 更新日期: 2023-09-27 18:07:08

我的代码抛出错误

当读取器关闭时,尝试调用Read无效。

我使用SqlDataReader从数据库读取值,这是我的代码:

while (rd.Read())
{
    string stateincharge = rd["stateincharge"].ToString();
    string email = rd["email"].ToString();
    cmd.Dispose();
    rd.Close();
    cmd = con.CreateCommand();
    cmd.CommandText = "str_procedure";
    cmd.Parameters.AddWithValue("@stateincharge", stateincharge);
    cmd.CommandType = CommandType.StoredProcedure;
    ad.SelectCommand = cmd;
    ad.Fill(ds);
    count = ds.Tables[0].Rows.Count;
    DataTable dt = new DataTable();
}

在ASP中循环运行。净后台代码。

我的问题是,我认为我需要关闭SqlDatReader,因为一个错误显示。

我怎么能再次打开sqlDataReader在while循环结束?

重新打开SqlDataReader

// connection for reader
using (SqlConnection connection1 = new SqlConnection(connectionString))
using (SqlCommand command1 = new connection1.CreateCommand())
{
    command1.CommandText = commandText1;
    connection1.Open();
    using (SqlDataReader reader = command1.ExecuteReader())
    {
        // fill table in loop
        while (reader.Read())
        {
            string stateincharge = reader["stateincharge"].ToString();
            string email = reader["email"].ToString();
            // connection for adapter
            using (SqlConnection connection2 = new SqlConnection(connectionString))
            using (SqlCommand command2 = new connection2.CreateCommand())
            {
                command2.CommandText = commandText2;
                command2.Parameters.AddWithValue("@stateincharge", stateincharge);
                command2.Parameters.AddWithValue("@email ", email );
                connection2.Open();
                DataTable table = new DataTable();
                using (SqlDataApapter adapter = new SqlDataAdapter(command2))
                {
                    adapter.Fill(table);
                    // yield return table;
                }
            }
        }
    }
}

您必须删除关闭读取器rd.Close();的行,因为您在while循环中关闭读取器,然后您尝试再次访问读取器。此外,我认为如果您使用新的SQL命令和新的适配器,您将不会收到此错误。

每个连接最多只能有一个活动命令(其中包括"响应",即读取器)。你试图做一个嵌套的调用数据库,这需要你要么加载数据完全(例如到一个DataTable)循环之前,或者你使用第二个连接的嵌套调用str_procedure

while (rd.Read())
    {
        string stateincharge = rd["stateincharge"].ToString();
        string email = rd["email"].ToString();
        cmd.Dispose();
        cmd = con.CreateCommand();
        cmd.CommandText = "str_procedure";
        cmd.Parameters.AddWithValue("@stateincharge", stateincharge);
        cmd.CommandType = CommandType.StoredProcedure;
        ad.SelectCommand = cmd;
        ad.Fill(ds);
        count = ds.Tables[0].Rows.Count;
        DataTable dt = new DataTable();
}
rd.Close();