IDataReader опустошается при повторном просмотре

StackOverflow https://stackoverflow.com/questions/259532

  •  06-07-2019
  •  | 
  •  

Вопрос

При попытке прочитать некоторые данные с помощью соединителя MySql.net происходит что-то довольно странное.Вот код:

IDataReader reader = null;

using (MySqlConnection connection = new MySqlConnection(this.ConnectionString))
{
    String getSearch = "select * from organization";
    MySqlCommand cmd = new MySqlCommand(getSearch, connection);
    cmd.CommandType = CommandType.Text;

    connection.Open();
    reader = cmd.ExecuteReader();

    while (reader.Read())
    {
        // response write some stuff to the screen (snipped for brevity)
    }
}

Если я поставлю точку останова после ExecuteReader и разверну представление результатов в Visual Studio (наведя курсор на средство чтения и развернув его), я смогу увидеть строки, возвращаемые запросом.Если я затем позволю этому закрыться и снова развернуть представление результатов, я получу сообщение «Перечисление не дало результатов».

Кажется, что содержимое ридера сбрасывается сразу после его просмотра.

Что касается того, что мы пробовали:
- SQL отлично работает непосредственно с БД
- Привязка результатов запроса непосредственно к сетке данных просто возвращает пустую сетку данных.
- получена последняя версия коннектора .net
- попробовал на двух разных машинах, чтобы исключить локальные ошибки

Пока ничего не получилось.

Если бы кто-нибудь мог предложить какие-либо идеи или предложения, мы были бы очень признательны.

Это было полезно?

Решение

насколько я понимаю, SqlDataReader предназначен для однократного перечисления возвращенных вами данных.После того, как вы один раз просмотрели результаты, объект выполнил свою задачу.Вот несколько идей, как обойти эту проблему, одна или другая из которых могут решить эту проблему за вас, в зависимости от ваших потребностей:

  1. Повторно выполните запрос, чтобы сгенерировать еще один SqlDataReader, когда это необходимо.

  2. Вместо использования SqlDataReader сохраните результаты исходного запроса в System.Data.DataTable, где вы сможете затем перечитывать данные и манипулировать ими по своему усмотрению.

Надеюсь это поможет!

Адам

Другие советы

Поскольку устройство чтения данных считывает информацию, используемый вами блок закрывает соединение с читателем сразу после присвоения его значения переменной. Здесь находится статья , в которой приведены некоторые примеры кода, который может привести вас туда, где вам нужно.

Ключ в том, что соединение ДОЛЖНО быть открытым при попытке чтения из устройства чтения.

Вот объяснение:

Это связано с тем, что вы уже один раз просматривали программу чтения в отладчике (при первом расширении представления).Так работают читатели, и, насколько я знаю, нет способа перезагрузить читатель, чтобы он снова начал читать, за исключением опции повторного выполнения:

Вам просто нужно снова запустить cmd.ExecuteReader(); Строка (щелкните правой кнопкой мыши в источнике и используя опцию «Установить следующее оператор»).

Это поведение считывателей данных.Если вы уже прошли его, вы не сможете вернуться назад.Вам придется выполнить команду еще раз и получить новую.

Если вам нужно использовать свои данные после закрытия программы чтения, вы можете использовать Typed DataSet, или нетипизированный DataSet как указано в Адаме отвечать.

Кстати, вот некоторые optimizations вы могли бы сделать:

  • Переместите считыватель внутрьConnection Использование блока, чтобы сделать его выходом из области после завершения его использования (как только вы выйдете из блока, соединение будет закрыто, и вы все равно не сможете его использовать, поэтому не имеет смысла оставлять его снаружи)
  • Бегать ExecuteReader в другой using блок (поскольку он реализует IDisposable) и сделайте то же самое с Sql Command (одинаковый IDisposable интерфейс)
  • Не получайте все поля из базы данных
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top