Повторно открыть SqlDataReader - PullRequest
       9

Повторно открыть SqlDataReader

0 голосов
/ 29 августа 2011

Мой код выдает ошибку

Недопустимая попытка вызова 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 из-за отображаемой ошибки.

Как я могу снова открыть sqlDataReader в конце цикла while?

Ответы [ 4 ]

2 голосов
/ 29 августа 2011
// 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;
                }
            }
        }
    }
}
0 голосов
/ 29 августа 2011
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();
0 голосов
/ 29 августа 2011

Каждое соединение может иметь не более одной активной команды (которая включает в себя «ответ», то есть считыватель). Вы пытаетесь сделать вложенный вызов к БД, и для этого необходимо либо полностью загрузить данные (например, в DataTable) перед циклом, либо использовать второе соединение для вложенных вызовов на str_procedure.

0 голосов
/ 29 августа 2011

Вы должны удалить строку, которая закрывает считыватель rd.Close();, потому что вы закрываете считыватель внутри цикла while, а затем пытаетесь снова получить доступ к считывателю. Кроме того, я думаю, что если вы использовали новую команду SQL и новый адаптер, вы не получите эту ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...