* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна!
Извлечение данных с помощью объектов DataAdapter
8 февраля 2009
Хотя объект DataSet не соединен с их источником данных, он представляет полный набор данных, включая таблицы, связи между ними и ограничения. Поскольку DataSet является отсоединенным представлением, он способен хранить информа- цию из нескольких источников. Все взаимодействие между DataSet и БД протекает под контролем объекта DataAdapter.
Объект DataAdapter инкапсулирует функциональность, необходимую для запол- нения DataSet данными и обновления БД, играя роль «моста» между соединением и объектом DataSet, В свойстве Connection объекта DataAdapter хранится ссылка на объект соединения, представляющий БД и позволяющий манипулировать ее содер- жимым. Объект DataAdapter также поддерживает свойство SelectCommand. Это свой- ство содержит объект Command, который представляет команды, осуществляющие выборку данных из источника. Как и у других компонентов провайдера данных, реализация объекта DataAdapter специфична для типа провайдера: SqlDataAdapter разработан специально для взаимодействия с SQL Server 7.0 и выше, a OleDbData- Adapter позволяет подключать самые разные источники данных. Чтобы заполнить DataSet данными, следует вызвать метод Fill объекта Data- Adapter. Этот метод исполняет команды, заданные свойством SelectCommand, на соединении, указанном свойством Connection, и заполняет DataSet данными, кото- рые возвращает исполненная команда. Методу Fill необходимо передать целевой объект, которым может быть DataSet либо DataTable, например: Visual Basic .NET Этот пример предполагает наличие адаптера данных с именем myDataAcfapter. Dim myDataSet As New DataSet() Исполнить команду, записанную а свойство SelectCommand, и заполнить результатами объект myDataSet. myDataAdapter.Fill(myDataSet) Visual C# // Этот пример предполагает наличие адаптера данных // с именем myDataAdapter. DataSet myDataSet = new DataSet(); // Исполнить команду, записанную в свойство SelectCommand, // и заполнить результатами объект myDataSet. myDataAdapter.Fill(myDataSet); Заметьте: взаимодействия с объектом Connection не происходит. При исполне- нии команды, вызванной методом Fill, соединение открывается только на нремя извлечения данных, после чего сразу же закрывается. Таким образом, после извле- чения данные становятся отсоединенными и ими можно манипулировать в коде независимо от БД, а при необходимости ее можно и обновить. *• Извлечение данных с помощью объекта Data-ttfapter 1. Создайте объект DataAdapter соответствующего типа, определяющий подлежа- щие выборке данные. 2. Создайте экземпляр класса DataSet или DataTable. 3. Вызовите метод Fill объекта DataAdapter, передав ему созданный объект Data Table или DataSet. Обычно для каждой таблицы с данными создают отдельный объект DataAdapter. Если нужно загрузить содержимое нескольких таблиц в один объект DataSet, следу- ет задействовать несколько объектов DataAdapter. Один и тот же объект DataSet мо- жет быть многократно передан методу Fill, при вызове которого у каждого объекта DataAdapter сознается новый объект DataTable, заполняется данными и добавляется к объекту DataSet. > Как заполнить объект DataSet данными из нескольких таблиц 1. Создайте экземпляр класса DataSet. 2. Создайте отдельный экземпляр DataAdapter соответствующего типа для каждой из таблиц, содержимое которой должно быть в DataSet. 3. Вызовите метод Filly каждого объекта DataAdapter, передав ему созданный ранее объект DataSet. Примечание При добавлении к объекту DataSet связанных таблиц DataAdapter не воспроизводит связи между ними, поэтому в DataSet их придется восстановить вруч- ную путем создания новых объектов DataRelation, Об этом рассказано на занятии 3. Предварительный просмотр данных Для предварительного просмотра данных, возвращаемых объектами DataAdapter, следует выбрать в меню Data элемент Preview Data. У типизированного объекта DataSet, как можно предположить по его названию, все члены строго типизированы. На таблицы и поля такого объекта DataSet можно ссылаться по их дружественным именам, представляющим реальные имена таблиц и столбцов, с которыми вы работаете; их значения доступны в виде значений соот- ветствующих типов, а не объектов. Это дает приложению целый ряд преимуществ. Во-первых, кол программы становится более понятным и его удобнее сопровож- дать. Во-вторых, ошибки из-за несоответствия типов обнаруживаются в период компиляции, а не в период выполнения — это экономит время, необходимое для тестирования. Наконец, полные имена членов наборов допустимо заменять их дру- жественными именами, при этом в период разработки имена типизированные чле- нов данных отображаются в окнах среды разработки благодаря технологии Intellisense. Ниже приводится пример эквивалентных строк кода, использующих типизи- рованные и нетипизированные объекты DataSet. Оба примера возвращают значе- ния поля Orderl D первой записи таблицы Orders в результирующем наборе dsorders. Вот первый пример, использующий нетипизированные объекты DataSet. Visual Basic .NET Dim myOrder As String myOrder = CType(dsOrders.Tables("Orders").Rows(0).Itern("OrderID"), String) Visual C# string rriyOrder; myOrder - (string)dsOrders.Tables["Orders"],Rows[0]["OrderID"]; Следующий пример написан с применением типизированных объектов DataSet. Как видите, второй фрагмент существенно проще и не требует явного преобразова- ния типов. Visual Basic .NET Dim rnyOrder As String myOroer = dsOrcers.Orders(0).OrderID Visual C# string myOrder; myOrder = dsOrders.Orders[0].OrderID; В действительности типизированный DataSet — это экземпляр совсем другого класса, производного от DataSet. Структура этого класса определяется файлом схе- мы XML (XSD-файлом), в котором описаны различные особенности структуры объекта DataSet, в том числе имена таблиц и столбцов. Для создания нового типи- зированного объекта DataSet требуется файл схемы, но его удается создать, только если структура данных, с которыми вам предстоит работать, известна заранее Чтобы генерировать типизированный объект DataSet, выберите в диалоговом окне Data команду Generate Dataset — откроется одноименное диалоговое окно. В открывшемся окне можно выбрать новый объект DataSet либо повторно сге- нерировать существующий. В этом списке отображаются все доступные таблицы с их объектами DataAdapter, Пометив флажок, расположенный внизу диалогового окна, вы добавите экземпляр нового объекта DataSet в окно дизайнера. По щелчку кнопки ОК генерируется XSD-файл с корректной схемой, необходи- мый для создания объекта DataSet. Если установить этот флажок, в окно конструк- тора добавляется экземпляр объекта DataSet, созданный на основе генерированной схемы. При заполнении нового объекта DataSet имена таблицы и столбцов совпада- ют с именами, указанными в схеме, а типы данных соответствуют типам, которые возвращаются объектом DataAdapter. *•• Как сгенерировать строго типизированный объект DataSet 1. Создайте и сконфигурируйте объекты DataAdapter соответствующего типа, воз- вращающие нужные таблицы с данными. 2. В меню Data выберите команду Generate Dataset. Примечание Это также можно сделать, щелкнув правой кнопкой мыши объект DataAdapter в окне дизайнера и выбрав команду Generate Dataset либо щелкнув кнопку Generate Dataset в окне Properties. 3. В диалоговом окне Generate Dataset щелкните New и назовите новый объект DataSet. 4. Выберите в списке доступных таблиц те, которые должны быть включены в схе- му. Чтобы добавить в окно дизайнера экземпляр объекта DataSet, установите соответствующий флажок. 5. Щелкните ОК — XSD-файл будет генерирован и добавлен к проекту. Если на предыдущем этапе вы установили флажок, на основе этого файла создается эк- земпляр объекта DataSet и добавляется в окно конструктора. Чтобы заполнить строго типизированный объект DataSet, вызовите метод Fill каждого объекта DataAdapter, чьи данные вы хотите добавить в объект DataSet, пе- редав этот DataSet при вызове как целевой объект.