重新打开SqlDataReader

时间:2011-08-29 08:42:24

标签: c# .net ado.net exception-handling sqldatareader

我的代码抛出错误

  

读取器关闭时无效尝试调用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.NET代码隐藏中循环运行。

我的问题是我认为由于显示错误,我需要关闭SqlDatReader。

如何在while循环结束时再次打开sqlDataReader?

4 个答案:

答案 0 :(得分:2)

// 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;
                }
            }
        }
    }
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

每个连接最多只能有一个活动命令(包括“响应”,即读取器)。您正在尝试对数据库执行嵌套调用,这要求您在循环之前完全加载数据(例如加载到DataTable),或者为嵌套调用{{{设置第二个连接。 1}}。

答案 3 :(得分:0)

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();