ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
Шрифт:
Объекты чтения данных оказываются полезными тогда, когда требуется очень быстро просмотреть большой объем данных и при этом нет необходимости заботиться об их представлении в памяти. Например, если вы запрашиваете 20000 записей из таблицы для того, чтобы сохранить их в текстовом файле, то при хранении этой информации в DataSet возникает достаточно большая нагрузка на память. Более выгодным решением оказывается создание объекта чтения данных, который будет обрабатывать каждую запись настолько быстро, насколько это возможно. Но при этом следует учитывать то, что объекты чтения данных (в отличие от объектов адаптера данных, которые мы рассмотрим позже) поддерживают
Объекты чтения данных получаются из объекта команды с помощью вызова ExecuteReader. При вызове этого метода объекту чтения данных можно дополнительно дать инструкцию автоматически закрыть соответствующий объект соединения, указав CommandBehavior.CloseConnection.
В следующем примере использования объекта чтения данных применяется метод Read для определения момента достижения конца записей (тогда возвращаемое значение оказывается равным false). Для каждой поступающей записи индексатору типа дается указание напечатать информацию о марке автомобиля, его названии и цвете. Также обратите внимание на то, что сразу же после завершении обработки записей вызывается метод Close, чтобы освободить объект соединения.
Замечание. Обрезка строковых данных здесь используется только для того, чтобы удалить пробелы в конце полей базы данных, и это никак не связано с ADO.NET.
Индексатор объекта чтения данных перегружен, чтобы ему можно было передать либо строку (представляющую имя столбца), либо целое число (соответствующее порядковому номеру столбца). Поэтому вы можете немного "подчистить" соответствующий фрагмент программы (избавившись от необходимости печатания имен) и использовать вариант, показанный ниже (обратите внимание на использование свойства FieldCount).
После компиляции и запуска этого проекта вы должны увидеть список всех автомобилей из таблицы Inventory базы данных Cars (рис. 22.7).
Рис. 22.7.
Получение множества наборов результатов с помощью объектов чтения данных
Объекты чтения данных могут получать от одного объекта команды множество наборов результатов. Например, чтобы получить все строки таблицы Inventory и все строки таблицы Customers, можно указать оба соответствующих SQL-оператора, используя в качестве разделителя точку с запятой.
Получив объект чтения данных, можно переходить от одного результирующего набора к другому с помощью метода NextResult. При этом возвращение к первому набору происходит автоматически. Поэтому, чтобы прочитать строки каждой таблицы, можно построить следующую итерационную конструкцию.
Теперь вы должны знать больше о возможностях объектов чтения данных. Эта объекты предлагают и другие возможности, о которых здесь не упоминалось (например, выполнение скалярных и однострочных запросов). Соответствующие подробности можно найти в документации .NET Framework 2.0 SDK.
Исходный код. Проект CarsDataReader размещен в подкаталоге, соответствующем главе 22.
Изменение содержимого таблиц с помощью объектов команд
Вы только что убедились, что метод ExecuteReader извлекает объект чтения данных, позволяющий проверить результаты выполнения SQL-оператора Select в однонаправленном и доступном только для чтения потоке. Но если вы хотите применить SQL-команду, в результате которой должна произойти модификация таблицы, вы должны вызвать метод ExecuteNonQuery соответствующего объекта команды. Этот метод выполняет вставки, обновления и. удаления в соответствии с форматом соответствующей команды.
Чтобы проиллюстрировать возможность модификации существующей базы данных с помощью вызова ExecuteNonQuery, мы с вами построим новое консольное приложение (CarsInventoryUpdater), предоставляющее пользователю возможность изменения данных таблицы Inventory базы данных Cars. Как и в других примерах, метод Main здесь отвечает за получение от пользователя инструкций по поводу выполнения конкретных действий, что программно реализуется с помощью оператора switch. Программа разрешает пользователю ввести следующие команды:
• I - вставить новую запись в таблицу Inventory;
• U - обновить существующую запись в таблице Inventory;
• D – удалить существующую запись из таблицы Inventory;
• L – вывести информацию об имеющемся наборе автомобилей, используя объект чтения данных;
• S – показать эти варианты выбора пользователю;
• Q - выйти из программы.
Каждый возможный вариант обрабатывается своим уникальным статическим методом в рамках класса Program. Для полной ясности вот реализация Main, которая, как кажется, не требует никаких дополнительных комментариев.
Неудержимый. Книга VIII
8. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
рейтинг книги
Законы Рода. Том 6
6. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
рейтинг книги
Восход. Солнцев. Книга I
1. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
рейтинг книги
Попаданка
Любовные романы:
любовно-фантастические романы
рейтинг книги
Возлюби болезнь свою
Научно-образовательная:
психология
рейтинг книги
