Как это исправить? «Неверная попытка вызвать CheckDataIsReady, когда читатель закрыт» - PullRequest
0 голосов
/ 10 апреля 2019

Я создал метод конструктора для выполнения sqldatareader, чтобы избежать повторного ввода sqlconnection, но при его использовании возникает ошибка:

public SqlDataReader ExecuteCommand(string cmdText, CommandType cmdType)
{
    SqlDataReader dr = null;
    using (SqlConnection conn = new SqlConnection(ConnString))
    {
        SqlCommand cmd = conn.CreateCommand();
        cmd.CommandText = cmdText;
        cmd.CommandType = cmdType;
        try
        {
            if (conn.State != ConnectionState.Open)
            {
                conn.Open();
                dr = cmd.ExecuteReader();
            }
        }
        catch(Exception e)
        {

        }
        finally
        {
            dr.Dispose();
            conn.Close();
        }
    }
    return dr;
}

Я пытаюсь использовать его, но возникает ошибка:

SqlDataReader dr = ExecuteCommand("Select * from EmployeeInfo where Employeeid = 2", CommandType.Text);
textBox1.Text = dr[1].ToString();

Ошибка:

Недопустимая попытка вызвать CheckDataIsReady, когда читатель закрыт.

1 Ответ

1 голос
/ 10 апреля 2019

Просто рассмотрите шаги вашей программы:

try
{
   if (conn.State != ConnectionState.Open)
   {
      conn.Open();
      dr = cmd.ExecuteReader();
   }
}

Сначала вы правильно открыли соединение и выполнили команду - с этим все в порядке!

finally
{
   dr.Dispose();
   conn.Close();
}

Далее ваш код попадает в блок finally - вы (пытаетесь) избавиться от считывателя и закрыть соединение! Опять ничего плохого в этом нет. Далее идет ваша проблема:

return dr;
...
textBox1.Text = dr[1].ToString();

Вы возвращаете закрытое устройство чтения, а затем пытаетесь прочитать его, что приводит к ошибке, которую вы получаете. ИМХО мне на ум приходят два возможных решения:

  1. вернуть читателя, не закрывая его (отметьте этот вопрос )
  2. кэширует результат чтения и возвращает его (в вашем случае строка для текстового поля)
...