Книги, научные публикации Pages:     | 1 | 2 | 3 | 4 | 5 |   ...   | 11 | -- [ Страница 1 ] --

David Sceppa Microsoft' ADO.NET Microsoft Press Дэвид Сеппа Microsoft ADO.NET

Москва 2003 И. Рг Vг ГI ГL IfII HЛ Р FL UА К IЦI И11 (л А ДИ УДК 004.45 ББК 32.973.26-018.2 С28 Сеппа Д.

С28 Microsoft ADO.NET/Пер. с англ. Ч М.: Издательско-торговый дом Русская Редакция, 2003- Ч 640 стр.: ил.

ISBN 5-7502-0223-2 Эта книга представляет собой достаточно полный справочник по библиоте кам ADO.NET, поставляемым с Microsoft.NET Framework. Вы узнаете об основных объектах модели ADO.NET и научитесь сохранять, искать, фильтровать и сорти ровать данные с использованием этих объектов. Структура книги позволяет по следовательно изучить ADO.NET с нуля* или, если вы опытный разработчик, бы стро найти ответы на интересующие вас вопросы. Здесь рассматриваются как подсоединенные, так и отсоединенные объекты, в том числе DataAdapter.DataSet, Connection, Command, Transaction, DataReader и др. Отдельный раздел книги по священ созданию эффективных Windows- и Web-приложений для доступа к БД с использованием ADO.NET Книга адресована прежде всего разработчикам приложений с поддержкой Web для доступа к БД при помощи Microsoft Visual Studio.NET и ADO.NET, а также всем, кто интересуется новой объектной модели ADO.NET Книга состоит из 14 глав, приложений и предметного указателя.

Прилагаемый компакт-диск содержит все примеры программ книги с ис ходными текстами и электронную версию книги с интегрированной системой поиска.

УДК 004. ББК 32.973-26-018. Подготовлено к изданию по лицензионному договору с Microsoft Corporation, Редмонд. Вашинг тон, США.

Microsoft, Microsoft Press, MSDN, Visual Basic, Visual C*. Visual InterDev, Visual Studio, Windows и Windows NT являются товарными знаками или охраняемыми товарными знаками корпорации Microsoft в США и/или других странах. Все друтие товарные знаки являются собственностью со ответствующих фирм.

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

й Оригинальное издание на английском язы ке, Microsoft Corporation, й Перевод на русский язык, Microsoft Corporation, й Оформление и подготовка к изданию, изда BN 0-7356-1423-7 (англ.) тельско-торговый дом Русская Редакция, ISBN 5-7502-0223-2 Оглавление Благодарности XXI Введение XXII Кому предназначена эта книга XXII Структура книги XXII Примеры кода, утилиты и прочие забавные штуки XXIII Системные требования ХХШ Техническая поддержка XXIV ЧАСТЬ ОСНОВЫ РАБОТЫ С MICROSOFT ADO.NET i Глава 1 Обзор ADO.NET Зачем нужна новая объектная модель Объектная модель ADO.NET Поставщики данных.NET Зачем необходимы отдельные классы и библиотеки Повышенная производительность Замечательные возможности расширения Пролиферация Обсуждение поставщиков данных.NET в этой книге Подсоединенные объекты Объект Connection Объект Command Объекты DataReader Объект Transaction Объект Parameter Объект DataAdapter Отсоединенные объекты Н Объект DataTable Объект DataColumn Объект Constraint 1- Объект DataRow Объект DataSet Объект DataRelation Объект Data View Метаданные Объекты DataSet со строгим контролем типов Вопросы, которые стоит задавать почаще Глава 2 Создание ADO.NET-приложений с помощью мастера DataForm Wizard Все без ума от примеров Создание связанной с данными формы средствами мастера Data Form Wizard Выбор подключения Выбор таблиц БД Создание отношений в объекте DataSet VI Оглавление Выбор отображаемых столбцов Выбор стиля отображения Использование новой связанной с данными формы Отображение данных в связанной форме Изучаем сгенерированный мастером код Реализация каскадных изменений с помощью объекта DataRelation Передача изменений в базу данных Вызываем метод Update объекта DataAdapter Изоляция измененных записей Реинтеграция изменений Панель компонентов Мастер Data Form Wizard Ч отправная точка создания приложений для работы с БД Вопросы, которые стоит задавать почаще ЧАСТЬ ПОДКЛЮЧАЕМСЯ: ИСПОЛЬЗОВАНИЕ ПОСТАВЩИКА ДАННЫХ.NET Глава 3 Подключение к базе данных Использование объектов Connection Создание объектов Connection Конструкторы Строки подключения 4б Поставщик OLE DB для БД SQL Server Поставщик OLE DB для БД Oracle Поставщик OLE DB для БД Access Поставщик OLE DB для драйверов ODBC Создание строк подключения в коде при помощи диалогового окна Data Links Создание строк подключения вручную при помощи диалогового окна Data Links Использование.udl-файлов в строке подключения Открытие и закрытие соединений Использование пула соединений Что такое пул соединений Как включить пул соединений Что делать, если не надо помещать соединения в пул Как узнать, действительно ли закрыто соединение или оно просто помещено в пул Разрыв соединений Создание других объектов с помощью объектов Connection Создание объектов Command Выполнение транзакций Получение информации схемы БД Функции среды Visual Studio.NET, доступные в период разработки Работа с объектами Connection в окне Server Explorer Добавление соединений в Server Explorer Поставщики данных OLE DB, ODBC и.NET Сохранение пароля Интегрированная проверка подлинности Добавление соединений в приложение Оглавление VII Панель компонентов Использование нового соединения Создание объектов Connection с помощью панели инструментов Использование нового соединения в период выполнения Где же код? Особенности объекта OleDbConnection Свойства объекта OleDbConnection Свойство Connections tring Свойство ConnectionTimeout Свойства Database и DataSource Свойство Provider Свойство ServerVersion Свойство State Методы объекта OteDbConnection Метод BeginTransaction Метод ChangeDatabase Метод Close Метод CreateCommand Метод GetOkDbSchemaTable Метод Open Метод ReleaseObjectPool События объекта OleDbConnection Событие InfoMessage Событие StateChange Вопросы, которые стоит задавать почаще Глава 4 Выполнение запросов к базе данных Использование объектов Command в коде Создание объекта Command Выполнение запроса, не возвращающего записей Просмотр результатов запроса с помощью объекта DataReader Выборка результатов Ускоренная выборка Выборка нескольких наборов результатов Выполнение пакетов командных запросов Закрытие объекта DataReader Выполнение запроса, возвращающего одно значение Выполнение параметризованного запроса Вызов хранимой процедуры Получение данных при помощи параметров вывода Выполнение запроса в транзакции Создание объектов Command в Visual Studio.NET Перетаскивание с панели инструментов Задание значения свойства Connection Использование Query Builder Использование нового объекта Command в коде Перетаскивание из Server Explorer Особенности объектов Command DataReader и Parameter Свойства объекта OleDbCommand Свойство CommandTimeout Свойство Command Type Свойство Parameters.. VIII Оглавление Свойство Transaction Свойство UpdatedRowSource Методы объекта OleDbCommand Метод Cancel МетодExecuteNonQuery Ill Метод ExecuteReader Ill Метод ExecuteScalar Метод Prepare Метод ResetCommandTirneoui П Свойства объекта OleDbDataReader Свойство Depth и метод GetData Свойство FieldCount Свойство IsClosed Свойство Item Свойство RecordsAffected Методы объекта OleDbDataReader Метод Read Метод GetValue Методы СеКТипДанных> Метод GetValues Метод NextResult Метод Close Методы GetName. GetOrdinal и GetDataTypeName Метод GetSchemaTable Метод GetData и свойство Depth Создание объектов Parameter Свойства объекта OleDbParameter Свойство ParameterName Свойство Direction Свойство Value Свойства SourceColumn и SourceVersion Свойства DbType и OleDb Type Свойства Precision, Scale и Size Вопросы, которые стоит задавать почаще Глава 5 Получение данных с помощью объектов DataAdapter Что представляет собой объект DataAdapter Чем объект DataAdapter отличается от других объектов, основанных на запросах Объект DataAdapter предназначен для работы с отсоединенными данными Между объектами DataAdapter и DataSet нет прямой связи Объект DataAdapter содержит логику обновления для передачи в БД изменений, хранящихся в объекте DataSet Логикой обновления в объекте DataAdapter можно управлять Анатомия объекта DataAdapter Дочерние команды Набор TableMappings Создание и использование объектов DataAdapter Создание объекта DataAdapter Конструкторы DataAdapter Оглавление IX Получение результатов запроса Использование метода Fill Создание объектов DataTable и DataColumn при помощи метода Fill... Использование перегруженных методов Fill Открытие и закрытие соединений Многократный вызов метода Fill Сопоставление результатов запроса объекту DataSet 14б Набор TableMappings объекта DataAdapter 14б Свойство MissingMappingAction Работа с пакетными запросами Получение результатов выполнения хранимых процедур Хранимые процедуры Oracle Выборка информации схемы СвойствоMissingSchemaAction ISO Метод FillScherna Создание объектов DataAdapter в Visual Studio.NET Перетаскивание объекта DataAdapter с панели инструметов Использование мастера Data Adapter Configuration Wizard Перетаскивание из Server Explorer Предварительный просмотр результатов, возвращаемых объектом DataAdapter Просмотр кода, генерируемого мастером Особенности объекта DataAdapter Свойства объекта DataAdapter Свойства SelectCommand, UpdateCommand, InsertCommand и DeleteCommand Свойство TableMappings Свойства MissingMappingAction и MissingSchemaAction Свойство AcceptChangesDuringFill Свойство ContinueUpdateOnError Методы объекта DataAdapter Метод Fill Метод FillSchema Метод GetFillParameters 1б Метод Update 1б События объекта DataAdapter Событие FiltError События RowUpdacing и RowUpdated 1б Вопросы, которые стоит задавать почаще ЧАСТЬ АВТОНОМНАЯ РАБОТА С ДАННЫМИ:

ОБЪЕКТ DATASET МОДЕЛИ ADO.NET Глава 6 Работа с объектами DataSet Возможности объекта DataSet Работа с отсоединенными данными Прокрутка, сортировка, поиск и фильтрация Работа с иерархически организованными данными Кэширование изменений Интеграция с XML Универсальная функциональность Оглавление Использование объектов DataSet 17" Создание объекта DataSet Просмотр структуры, создаваемой при вызове метода DataAdapter.Fill Объект DataTable Объект DataColumn Просмотр данных, возвращаемых объектом DataAdapter Объект DataRow Просмотр содержимого объекта DataRow Просмотр объектов DataRow в объекте DataTable Проверка данных в объекте DataSet Свойства объекта DataColumn, используемые для проверки данных... Набор Constraints объекта DataTable Получение информации схемы с помощью метода DataAdapter.FillSchema Создание объектов DataTable в коде Создание объекта DataTable Добавление объекта DataTable в набор Tables объекта DataSet Добавление столбцов в объект DataTable Указание типа данных объекта DataColumn Добавление первичного ключа Добавление других ограничений Использование столбцов с автоинкрементом Добавление столбца, основанного на выражении Создание объектов DataTable, соответствующих таблицам Customers, Orders и Order Details Изменение содержимого объекта DataTable Добавление нового объекта DataRow Редактирование существующей записи Работа со значениями Null в объекте DataRow Удаление объекта DataRow Исключение объекта DataRow Использование свойства DataRow.RowState Просмотр отложенных изменений объекта DataRow Работа с объектами DataSet в среде Visual Studio.NET Генерирование объекта DataSet на основе объектов DataAdapter Создание нового объекта DataSet с нуля Создание объекта DataSet без контроля типов Особенности объектов DataSet, DataTable, DataColumn, DataRow, UniqueConstraint и ForeignKeyConstraint Свойства объекта DataSet Свойство CaseSensitive Свойство DataSetName Свойство DesignMode Свойство EnforceConstraints Свойство ExtendedProperties Свойство HasErrors Свойство Locale Свойства Namespace и Prefix Свойство Relations Свойство Tables.. Оглавление XI Методы объекта DataSet Методы AcceptChanges и RejectChanges Методы Beginmit и Endlnit Метод Clear Методы Clone и Сору Метод GetChanges Методы GetXmJ и GetXmlSchema Метод HasChanges Метод Merge Методы ReadXtnl и Wri teXml Методы ReadXmlSchema, WriteXmlSchema и InferXrnlSchema 2. Метод Reset События объекта DataSet Событие MergeFailed Свойства объекта DataTable Свойство CaseSensitive Свойства ChildReiations и ParentRelations Свойство Columns Свойство Constraints Свойство DataSet Свойство DefaultView Свойство DesignMode Свойство ExtendedProperties Свойство HasErrors Свойство Locale Свойство MinimumCapacity Свойства Namespace и Prefix Свойство PrimaryKey Свойство Rows Свойство TableName Методы объекта DataTable Методы AcceptChanges и RejectChanges Методы Beginlnit и Endlnit Методы BeginLoadData и EndLoadData ! Метод Clear Методы Clone и Сору Метод Compute Метод GetChanges Метод GetErrors Методы ImportRow, LoadDataRow и NewRow Метод Reset Метод Select События объекта DataTable : События ColumnChanged и ColumnChanging События RowChanged и RowChanging События RowDeleted и RowDeJeting Свойства объекта DataColumn Свойство AllowDBNull Свойства Autolncrement, AutoIncrementSeed и AutoIncrementStep XII Оглавление Свойство Caption Свойство ColumnMapping Свойство ColumnName Свойство DataType Свойство DefaultValue Свойство Expression Свойство ExtendedProperties Свойство MaxLength Свойства Namespace и Prefix Свойство Ordinal Свойство Readonly Свойство Table Свойство Unique Свойства объекта DataRow Свойство HasErrors Свойство Item Свойство ItemArray Свойство RowError Свойство RowState Свойство Table Методы объекта DataRow Методы AcccptChanges и RejectChanges Методы BeginEdit, CancelEdit и EndEdit Метод ClearErrors Метод Delete Метод GetChildRows Методы GetColumnError и SetColumnError Метод GetColumnsInErrar Методы GetParentRow, GetParentRows и SetParentRow Метод HasVersion Метод IsNull Свойства объекта UniqueConstraint :

Свойство Columns Свойство ConstraintName Свойство ExtendedProperties Свойство IsPrimaryKey Свойство Table Свойства объекта ForeignKeyConstraint Свойства AcceptRejectRule, DeleteRule и UpdateRuie Свойства Columns и RelatedColumns Свойство ConstraintName Свойство ExtendedProperties Свойства RelatedTable и Table Вопросы, которые стоит задавать почаще Глава 7 Работа с реляционными данными Особенности доступа к реляционным данным Соединяющие запросы Отдельные запросы Иерархичные объекты Recordset модели ADO Оглавление XIII Объекты DataReiation модели ADO.NET Работа с объектами DataReJation в коде Создание объектов DataReiation Поиск связанных данных Метод GetChildRows объекта DataRow Метод GetParentRow объекта DataRow Метод GetParentRows объекта DataRow Выбор версии данных для просмотра 2( Проверка данных средствами объектов DataReiation Создание ограничений Использование имеющихся ограничений Смотри-ка! Нет ограничений! Объекты DataReiation, ссылающиеся на себя Отношения многие ко многим 2~ Использование объектов DataReiation в объектах DataColumn.

основанных на выражениях Каскадирование изменений Свойства DeleteRule и UpdateRule объекта ForeignKeyConstraint Постепенный отказ от соединяющих запросов Создание объектов DataReiation в Visual Studio.NET Добавление объекта DataReiation в объект DataSet со строгим контролем типов Добавление объекта DataReiation в объект DataSet без контроля типов Особенности объекта DataReiation Свойства объекта DataReiation Свойство ChildColumns Свойство ChildKeyConstrain! Свойство ChildTable Свойство DataSet Свойство ExtendedProperties Свойство Nested Свойство ParentColumns Свойство ParentKeyCorestraint Свойство ParentTable Свойство RelationName Вопросы, которые стоит задавать почаще Глава 8 Сортировка, поиск, фильтрация Возможности поиска и фильтрации объекта DataTable Поиск записи по значениям первичного ключа Динамичный поиск Поиск по шаблону Использование символов-разделителей Использование дополнительных методов Select Указание порядка сортировки Указание нужного состояния искомых записей Что представляет собой объект Data View Объекты Data View возвращают данные из объектов DataTable Объекты Data View не являются SQL-запросами Использование объектов Data View в коде Создание объектов Data View Использование свойства RowStateFilter.... XIV Оглавление Использование объекта DataRowView Просмотр всех записей данных, доступных через объект DataView Поиск данных в объекте DataView Метод Find Метод FindRows Модифицирование объектов DataRowView Создание объектов DataView в Visual Studio.NET Добавление нового объекта DataView в конструктор Задание значений свойств объекта DataView Особенности объекта DataView Свойства объекта DataView Свойства AllowDelete, AUowEdit и AllowNew Свойство ApplyDefaultSort Свойства Count и Item Свойство DataViewManager Свойство RowFilter Свойство RowStateFilter Свойство Sort Свойство Table ЗЮ Методы объекта DataView Методы AddNew и Delete Методы Beginlnit и Endlnit 3И МетодСоруТо ЗП Методы Find и FindRows Метод GetEnumerator Событие ListChanged объекта DataView Свойства объекта DataRowView Свойство DataView^ Свойства IsEdit и IsNew Свойство Item Свойство Row Свойство RowVersion Методы объекта DataRowView Методы BeginEdit, CancelEdit и EndEdit Метод CreateCMdView Метод Delete Вопросы, которые стоит задавать почаще Глава 9 Работа с объектами DataSet со строгим контролем типов Создание объектов DataSet со строгим контролем типов Сложный способ Использование метода WriteXmlSchema объекта DataSet Использование утилиты XML Schema Definition Tool Простой способ Где же находится файл класса? Использование объектов DataSet со строгим контролем типов Добавление записи Поискзаписи Редактирование записи.. Оглавление XV Работа со значениями NULL Работа с иерархичными данными Прочие возможности объектов DaraSet, DataTable и DataRow Когда стоит использовать объекты DataSet со строгим контролем типов Программные компоненты и швейцарские армейские ножи Преимущества периода разработки Преимущества периода выполнения Что еще следует учесть Осуществление структурных изменений Преобразование объектов DataSet Возможность генерирования данных без контроля типов Выбор способа разработки Вопросы, которые стоит задавать почаще Глава 10 Передача обновлений в базу данных Урок истории Преимущества передачи обновлений с использованием объектов Recordset ADO Недостатки передачи обновлений с использованием объектов Recordset ADO Передача обновлений с помощью объектов Command модели ADO.NET Передача обновлений с использованием объектов DataAdapter ADO.NET Конфигурирование объектов DataAdapter вручную Связанные параметры Передача обновлений с использованием хранимых процедур Использование собственной логики обновления Преимущества Недостатки Создание логики обновления с помощью объекта CommandBuilder Как объект CommandBuilder генерирует логику обновления Преимущества и недостатки использования объекта CommandBuilder 37( Создание логики обновления средствами мастера Data Adapter Configuration Wizard Просмотр структуры объекта DataAdapter Параметры генерации логики обноачения Передача обновлений с помощью хранимых процедур Преимущества и недостатки использования мастера Прочие проблемы обновления Способы оптимистичного управления параллелизмом Использование только полей первичного ключа Использование всех полей в разделе WHERE Использование полей первичного ключа и полей типа timestamp Использование полей первичного ключа и измененных полей Работа со значениями NULL Передача обновлений в транзакциях Использование набора TableMappings Лучший способ обновления Особенности объекта OleDbCommandBuilder Свойства объекта OleDbCommandBuilder Свойство DataAdapter.' Свойства QuotePrefix и QuoteSuffix Методы объекта OleDbCommandBuilder XVI Оглавление Метод DeriveParameters Методы GetDeleteCommand, GetlnsertCommand и GetUpdateCommanct Метод RefreshSchema Вопросы, которые стоит задавать почаще Глава 11 Сложные случаи обновления данных Обновление отображаемого содержимого записи после передачи изменений Получение новых значений поля timestamp после передачи обновления Выборка данных при помощи пакетных запросов после передачи обновления Свойство UpdatedDataSource объекта Command Выборка новых данных с помощью параметров вывода Выборка данных с помощью события RowUpdated объекта DataAdapter после передачи обновления Приложение Timestamp Выборка новых значений автоинкремента Работа с SQL Server Функция @@IDENTITY и ключевое слово SCOPEJDENTITY Работа с Access 2000 Работа с последовательностями Oracle Генерирование фиктивных значений для объектов DataColumn последовательности Приложение, выбирающее значения автоинкремента Использование ключевого слова NOCOUNT SQLServer Передача иерархичных изменений Передача записей, ожидающих вставки и удаления Передача иерархичных изменений с помощью метода Select объекта DacaTable Передача иерархичных изменений с помощью метода GetChanges..,. Работа со значениями автоинкремента и реляционными данными Изоляция и повторная интеграция изменений Экономное использование полосы пропускания при помощи метода GetChanges Метод Merge объекта DataSet Метод Merge и свойство RowState Метод Merge и значения автринкремента Изящная обработка неудачных попыток обновления Опережающее планирование KOI 1фликтов Свойство ContinueUpdateOnError объекта DataAdapter Информирование пользователя об ошибках Выборка текущего содержимого конфликтующих записей Если сначала не получилось Импорт новых оригинальных* значений с помощью метода DataSet.Merge Приложение Conflicts Работа с распределенными транзакциями Координаторы транзакций и диспетчеры ресурсов Двухфазная фиксация Распределенные транзакции в.NET Framework Поддержка распределенных транзакций в БД Создание собственных компонентов Оглавление XVII Атрибут TransactionOption Регистрация ADO.NET-соединения в транзакции Подтверждение или отмена результатов работы Упрощенная работа с распределенными транзакциями Приложение DistributedTransaction Прочие преимущества использования служб Component Services В сложных случаях обновления данных всегда используйте ADO.NET Вопросы, которые стоит задавать почаще Глава 12 Работа с XML-данными Мост через пропасть между XML и доступом к данным Запись и считывание XML-данных 4~> Методы объекта DataSet для работы с XML-данными Метод GetXml Методы WriteXml и ReadXml Методы WriteXmlSchema, ReadXmlSchema и InferXmlSchema Формирование схем Свойства ADO.NET. влияющие на схему XML-документа Имена элементов и атрибутов Элементы или атрибуты: что выбрать? Вложенные реляционные данные Пространства имен и префиксы Кэширование изменений и XML-документы XML-документы формата diffgram DataSet + XmlDocurnent = XmlDataDocument Использование объекта XmlDataDocument Работа с объектом DataSet как с XML-документом 46- Кэширование обновлений XML-документа Получение XML-данных из БД SQL Server 2000 Использование запросов SELECT...FOR XML, Выполнение запроса SELECT...FOR XML в SQL Server Query Analyxer 4б Загрузка результатов запроса в объект DataSet Загрузка результатов запроса в объект XmlDocurnent Поставщик данных SQL XML.NET Data Provider Загрузка данных в объект XmlDocurnent с помощью объекта SqlXmlCommand Загрузка данных в объект DataSet с помощью объекта SqlXmLVdapter Использование шаблонов запросов Выполнение шаблонных запросов с использованием объекта SqlXmlCommand Параметризованные шаблонные запросы Работа с запросами XPath Добавление информации схемы XSLT-трансформация Передача обновлений Логика обновления, используемая объектом SqlXmlCommand Простой пример с использованием ADO.NET и XML Два пути к одному конечному пункту ADO.NET и XML счастливая пара Вопросы, которые стоит задавать почаще XVIII Оглавление ЧАСТЬ СОЗДАНИЕ ЭФФЕКТИВНЫХ ПРИЛОЖЕНИЙ С ИСПОЛЬЗОВАНИЕМ ADO.NET Глава 13 Создание эффективных Windows-приложений Быстрое создание пользовательского интерфейса при помощи связывания с данными Этап 1. Создание объектов DataAdapter и DataSet Этап 2. Добавление связанных с данными элементов управления TextBox Этап 3. Получение данных Этап 4- Добавление кнопок для перемещения по содержимому объекта DataSee Этап 5. Добавление кнопок Add и Delete Этап 6. Передача изменений в БД Этап 7. Добавление кнопок Edit. Update и Cancel Этап 8. Просмотр дочерних данных Получение только списка заказанных клиентом товаров Добавление объекта DataTable Order Details в класс DataSet со строгим контролем типов Добавление элемента управления DataGrid, отображающего дочерние данные Передача в БД изменений из обеих таблиц Этап 9- Связывание второй формы с тем же источником данных Этап 10. Совершенствование пользовательского интерфейса Добавление функции поиска с использованием элемента управления ComboBox Управление форматом связанных данных Этап 11. Если хочешь сделать что-то хорошо Резюме: связывание с данными Проблемы разработки приложений Выборка только необходимых данных Стратегии обновления Мгновенные и кэшированные обновления Повторная выборка перед разрешением изменений ADO.NET и пессимистическое управление блокировками Стратегии подключения Подсоединение и отсоединение Пул соединений Работа с данными больших двоичных объектов Отложенная выборка ВЮВ-данных Обработка ВЮВ-данных с помощью объектов DataSet Обработка ВЮВ-данных с помощью объектов DataReader Двоичные BLOB-данные в БД Northwind Пример приложения для работы с ВЮВ-данными Пользовательские интерфейсы, созданные с применением тяжелой артиллерии ADO.NET Вопросы, которые стоит задавать почаще Глава 14 Создание эффективных Web-приложений Краткий обзор Web-приложений : ASP.NRTупрощает разработку Web-приложений Оглавление XIX Преимущества и недостатки способа без хранения сведений о состоянии.... Забывчивый сервер, молчаливый клиент Подключение к БД Использование доверенных соединений Подмена пользователей Работа с БД Access Вывод данных на Web-странице Использование метода DataBinder.Eval Связывание элемента управления TextBox с объектом DataSet 5 Связывание элемента управления TextBox с объектом DataReader Связывание элементов управления DataGrid с результатами запросов Связывание элемента управления DataGrid с объектом DataSet Связывание элемента управления DataGrid с объектом DataReader 5 Кэширование данных между обращениями к БД Способ без хранения сведений о состоянии Преимущества Недостатки Кэширование данных на стороне клиента Файлы cookie Скрытые поля Свойство ViewState Хранение сведений о состоянии на стороне Web-сервера Свойство Session Объект Application Объект Cache Кэширование вывода Хранение сведений о состоянии в БД Преимущества Недостатки Рекомендации по хранению сведений о состоянии 54 :> Хранение данных в объектах ViewState Хранение данных в объекте Application Хранение данных в объекте Session Хранение данных в БД Кэширование вывода Постраничная разбивка информации Средства постраничного предстаачения информации, предоставляемые Web-элементом управления DataGrid Свойство AllowPaging Свойства AllowCustomPaging и VirtualltemCount Средства постраничного представления информации, предоставляемые методом РШ объекта DataAdapter Создание запросов, возвращающих страницу данных Приложение PagingOptions Редактирование данных на Web-странице Упрощение редактирования данных при помощи элемента управления DataGrid Обработка событий, связанных с редактированием содержимого DataGrid,.. Передача изменений в БД Внесение изменений в объект DataSet Создание собственных запросов UPDATE Приложение ShoppingCart Вопросы, которые стоит задавать почаще XX Оглавление ПРИЛОЖЕНИЯ Приложение А Прочие поставщики данных.NET Поставщик данных SQL Client.NET Data Provider Именованные параметры и маркеры параметров 5бО Подключение к БД SQL Server с помощью объекта SqlConnection 5б Получение результатов запроса с помощью объекта SqlDataAdapter Использование объектов SqlCommand и SqlDataReader 5бЗ Методы GetSqKTMnaHHbix> и пространство имен SqlTypes Вызов хранимых процедур Получение информации схемы БД Поставщик данных ODBC.NET Data Provider Подключение к БД при помощи объекта OdbcConnection Использование параметризованных запросов Получение результатов запроса с помощью объекта OdbcDataAdapter Просмотр результатов запроса при помощи объекта OdbcDataReader Вызов хранимой процедуры Получение информации схемы БД Поставщик данных Oracle Client.NET Data Provider Подключение к БД при помощи объекта OracleConnection Использование параметризованных запросов Получение результатов запроса с помощью объекта OracleDataAdapter Просмотр результатов запроса при помощи объекта OracleDataReader Специфичные для Oracle типы данных Вызов хранимой процедуры Выборка данных из курсоров REF Получение информации схемы БД Проблемы, общие для поставщиков данных.NET Создание кода, независимого от поставщика Выбор подходящего типа данных поставщика.NET Приложение Б Утилиты Утилита ADO.NET Ad Hoc Query Tool Подключение к БД Добавление поставщиков данных.NET Выполнение запросов Просмотр информации схемы Передача обновлений Параметры приложения Утилита ADO.NET DataAdapter Builder Определение логики обновления Элемент управления ADO.NET Navigation Control Добавление элемента управления ADO.NET Navigation Control на панель инструментов Visual Studio.NET Конфигурирование свойств ADO.NET Navigation Control, обеспечивающих взаимодействие с данными Конфигурирование прочих свойств ADO.NET Navigation Control 596" Предметный указатель Об авторе Благодарности П,.режде всего, благодарю своих мать и отца за терпение и поддержку, оказан ную мне при работе как над этой книгой, так и вообще в жизни.

Спасибо Джеки Ричарде (Jackie Richards), которая воодушевляла и работала в тесном контакте со мной, а также провела подробное исследование возможнос тей объектной модели ADO.NET.

Благодарю Сэма Карпентера (Sam Carpenter), который вытаскивал меня выпить пива, веселил и раскрыл мне некоторые перспективы моего проекта, и Брэда Ро деса (Brad Rhodes), написавшего предисловие к этой книге.

Хочу сказать спасибо Стиву ДюМошу (Steve DuMosch), который останавливал мои напыщенные речи, случавшиеся время от времени, и убедил снова надеть бутсы для мини-футбола.

Благодарю Стива Эллиса (Steve Ellis), направлявшего меня при работе над этим проектом, докторов Джонатана и Стефани Брэмен (Dr. Jonathan and Stephanie Braman), вместе с которыми я в начале года совершил путешествие на Мег, и ко торые приютили мою приставку Х-Вох на несколько месяцев.

Благодарю и поздравляю команды Microsoft WebData и Visual Studio.NET, ко торые создали и в срок выпустили самый мощный набор технологий доступа ЕС данным.

А также спасибо коллективу Microsoft Press, сыгравшему значительную роль в том, что сей труд появился на полках книжных магазинов.

Введение Модель Microsoft ADO.NET Ч большой шаг вперед в области технологий доступа к данным Microsoft. Она предоставляет разработчику беспрецедентные возмож ности для управления взаимодействием кода и данных Ч приятное усовершен ствование для тех программистов, которые мечтали об этом, используя предыду щие технологии на основе черного ящика*, такие, как ядро курсоров ADO, среда Microsoft Visual Studio 6 Data Environment и поставщик MSDataShape OLE DB Provider.

ADO.NET Ч не только самая мощная и надежная технология доступа к данным, предлагаемая сегодня разработчикам компанией Microsoft. Она характеризуется невероятно крутой кривой обучения: изучать ее трудно, но те. кто эти трудности преодолели, в один голос говорят о значительном повышении производительно сти труда. Разработчики, познакомившиеся с основами объектной модели, по-пре жнему задают вопросы, касающиеся нюансов ADO.NET, например: Как управлять именами таблиц, при помощи которых объект DataAdapter сопоставляет резуль таты моего пакетного запроса с моим объектом DataSefi* или Почему, когда я ис пользую созданный мной объект DafaSet, при повторном заполнении в нем по являются дублирующие записи, а в случае с объектом DataSet, созданным средой Visual Studio.NET, этого не происходит?*.

Кому предназначена эта книга Эта книга Ч исчерпывающее руководство по ADO.NET, предназначенное всем разработчикам, даже не имеющим опыта работы с данной технологией. Я не пред полагал, что вы знакомы с объектом DataReader из класса DataSet. Структура кни ги позволяет последовательно изучать ADO.NET с нуля или, если вы опытный разработчик, быстро найти ответы на интересующие вас вопросы.

Структура книги Все главы, посвященные определенному объекту или их группе, начинаются с описания соответствующего объекта/объектов, далее приводятся инструкции по использованию их основных функций. Почти во всех главах я рассказываю, как сэкономить время на разработку, создавая объекты средствами Visual Studio.NET.

Каждая глава содержит справочную информацию по обсуждаемому объекту и раздел Вопросы, которые стоит задавать почаще, где я рассматриваю вопросы, важность которых разработчики зачастую недооценивают. Иногда справочная ин формация частично повторяет сведения предыдущих глав. Полагаю, это необхо димо, т. к. позволяет избежать прыганья* взад-вперед по главам.

Книга делится на четыре части. В первой приводится обзор объектной моде ли ADO.NET и инструкции по работе с мастером Data Form Wizard. Вторая часть Введение XXIII посвящена использованию различных объектов, предоставляемых поставщиками данных.NET Ч Connection, Command, DataReader и DataAdapter. В третьей части обсуждаются лотсоединенные* объекты модели ADO.NET Ч DataSet, DataTable, DataColumn, DataRotv, DataRelation и DataView. Кроме того, рассматриваются про стые и сложные случаи передачи изменений в базу данных при помощи объекта DataAdapter, а также функции ADO.NET для работы с XML-данными. Четвертая часть посвящена способам эффективной разработки Windows- и Web -приложений с использованием ADO.NET.

Примеры кода, утилиты и прочие забавные штуки В большинстве приведенных в книге фрагментов кода используется поставщик OLE DB.NET Data Provider. Я выбрал его потому что из двух поставщиков данных.NET, входящих в состав Microsoft.NET Framework, он более луниверсальный. Фраг менты кода рассчитаны на взаимодействие с Microsoft Desktop Engine (MSDE) и Microsoft SQL Server, но их можно изменить для работы с любой БД, для которой имеется поставщик OLE DB. В приложении А приведены фрагменты кода, исполь зующие поставщиков SQL Client.NET Data Provider, ODBC.NET Data Provider и Oracle Client.NET Data Provider.

Приложение Б посвящено трем утилитам, записанным при прилагаемом ком пакт-диске: Ad Hoc Query (утилита для выполнения произвольных запросов к БД), DataAdapter Builder (утилита, генерирующая логику- обновления для объекта Data Adapter^ и элемент для перемещения по содержимому объекта DataSet, предназ наченный для Windows-форм. Все утилиты могут работать с любым поставщиком данных.NET, а не только с поставщиками SQL Client.NET Data Provider и ODBC.NETData Provider. На компакт-диске, прилагаемом к книге, также записан исход ный код каждой утилиты. Он рассчитан на разработчиков, которые захотят из менить функциональность утилит;

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

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

На прилагаемом к книге компакт-диске записаны фрагменты кода, три выше упомянутые утилиты, а также электронная оригинальная версия книги с интег рированной системой поиска. Приведенные в книге фрагменты кода также до ступны по адресу Чтобы открыть страницу со ссылками на файлы с фрагментами кода, щелкните ссылку Companion Content в меню, в правой части экрана.

Надеюсь, эта информация вам пригодится.

Системные требования Для работы с файлами примеров и программами, записанными на прилагаемом компакт-диске, ваш компьютер должен соответствовать приведенной ниже мини мальной конфигурации:

XXIV Введение Х пакет инструментальных средств разработчика Microsoft.NET Framework SDK (доступен по адресу bttp://msdn.microsoft.com/ne);

Х среда разработки Visual Studio.NET (необязательна, но рекомендуется);

Х бразуер Microsoft Internet Explorer версии 5.01 или более поздней.

Техническая поддержка Издательский коллектив приложил все усилия, чтобы обеспечить точность инфор мации книги и содержимого прилагаемого компакт-диска. Microsoft Press прини мает поправки к книге по адресу Напрямую подключиться к Базе знаний Microsoft и задать вопрос по интересующей вас про блеме можно по адресу Если у вас есть комментарии, вопросы или идеи, связанные с этой книгой, присылайте их в Microsoft Press одним из следующих способов.

Обычной почтой:

Microsoft Press Microsoft ADOMET (Core Reference) Editor One Microsoft Way Redmond, WA 98052- Электронной почтой:

MSPINPUT@MICROSOET.COM Учтите, что поддержка продукта не предоставляется по указанным адресам.

Подробнее о поддержке ADO.NET, Visual Basic.NET, Visual C*.NET, Visual Studio.NET и.NET Framework Ч на Web-узле Microsoft Press Support по адресу rosoft.com.

ЧАСТЬ ОСНОВЫ РАБОТЫ С MICROSOFT ADO.NET ГЛАВА Обзор ADO.NET /\DO.NET Ч это набор библиотек, поставляемый с Microsoft.NET Framework и предназначенный для взаимодействия с различными хранилищами данных из.NET приложений. Библиотеки ADO.NET включают классы для подсоединения к источ нику данных, выполнения запросов и обработки их результатов. Кроме того, ADO.NET можно использовать в качестве надежного, иерархически организован ного, отсоединенного кэша данных для автономной работы с данными. Главный отсоединенный объект, DataSet, позволяет сортировать, осуществлять поиск, филь тровать, сохранять отложенные изменения и перемещаться по иерархичным дан ным. Кроме того, объект DataSet включает ряд функций, сокращающих разрыв между традиционным доступом к данным и программированием с использованием XML. Теперь разработчики получили возможность работать с XML-данными че рез обычные интерфейсы доступа к данным и наоборот.

Если вкратце, при создании приложений для работы с данными нужно исполь зовать ADO.NET В Microsoft Visual Studio.NET есть ряд функций, предназначенных для созда ния приложений для доступа к данным. Одни из них экономят время на разра ботку, генерируя большие объемы скучного кода. Другие повышают производи тельность ваших приложений, добавляя метаданные и логику обновления в код вместо того, чтобы выбирать эту информацию в период выполнения. Хотите верьте, хотите Ч нет, но большинство функций доступа к данным, предоставляе мых Visual Studio.NET, выполняют сразу обе этих задачи.

Говоря о ADO.NET, мы также рассмотрим в этой книге и средства Visual Studio.NET, экономящие время и усилия на разработку.

ГЛАВА 1 Обзор ADO.NET Зачем нужна новая объектная модель Разработчики, имеющие опыт работы с предыдущей технологией доступа к дан ным Microsoft, ActiveX Data Objects (ADO), могут спросить;

Разве ADO нужна не для того же? Зачем Microsoft создала новую технологию доступа к данным? Похоже, что в каждой последующей версии Visual Basic реализуется новая модель доступа к данным. В Visual Basic 3-0 появилась технология Data Access Objects (DAO).

В Visual Basic 4.0 - Remote Data Objects (RDO). В Visual Basic 5 и Visual Studio 97 OBDCDirect. В Visual Basic 6 и Visual Studio 6 Ч ADO.

Некоторые разработчики рассматривают эти непрерывные изменения как тонко завуалированную попытку продавать техническую литературу. На самом же деле Microsoft разрабатывала новые технологии доступа к данным для удовлетворения постоянно растущих потребностей разработчиков.

Изначально DAO предназначалась для взаимодействия с БД на основе локаль ных файлов. Вскоре разработчикам захотелось взаимодействовать с серверными БД типа Microsoft SQL Server и Oracle. DAO позволяла взаимодействовать с ними, однако программистам требовались более широкие возможности управления и большая производительность. Тогда группа разработчиков Visual Basic создала RDO Ч быстрый и простой уровень доступа к данным, предназначенный для вза имодействия с серверными БД. Конечно, мощь RDO впечатляла, но не хотелось в то же время отказываться и от и простоты DAO. Microsoft создала технологию ODBCDirect, попытавшись объединить в ней лучшие стороны RDO и DAO. Появился Интернет, и понадобилась модель доступа к данным, простая для работы в сер верных сценариях, которая требовала бы меньше кода и позволяла бы клиент)-- и серверу обмениваться структурами данных. В ответ на эту потребность появилась ADO.

За прошедшие несколько лет ADO верой и правдой послужила многим разра ботчикам, однако ей не хватает некоторых ключевых функций, необходимых для создания мощных приложений. Например, все больше и больше разработчиков хотят работать с XML-данными. И хотя в последних версиях ADO появились со ответствующие функции, сама технология изначально не рассчитана на взаимо действие с такими данными. Так, ADO не позволяет отделить информацию схе мы от фактических данных. Возможно, Microsoft добавит в будущие версии ADO дополнительные XML-функции, однако ADO никогда не будет обрабатывать XML данные так же эффективно, как это делает ADO.NET. Это обусловлено тем, что ADO.NET создавалась с учетом, a ADO Ч без учета XML. Ядро курсоров ADO по зволяет передавать отсоединенные объекты Recordset между различными уровня ми приложения, но объединить содержимое нескольких таких объектов нельзя.

В ADO разрешено передавать каптированные изменения в БД, однако нет средств управления логикой обновления. Кроме того, ядро курсоров ADO, например, не позволяет передавать отложенные изменения в БД при помощи хранимых про цедур. Поскольку многие администраторы БД позволяют пользователям изменять содержимое БД только средствами хранимых процедур, большинство лишено возможности передавать изменения через объект Recordset ADO.

Microsoft разработала ADO.NET для решениях этих, а также некоторых других проблем, подробно о которых я расскажу в этой книге.

Часть 1 Основы работы с Microsoft ADO.NET Как и ее предшественницы, ADO предназначалась для разработки приложений на основе технологии СОМ. С появлением общеязыковой среды выполнения (com mon language runtime) и.NET Framework Microsoft полностью пересмотрела сре ду Visual Studio. Теперь мы имеем пакеты Windows Forms и Web Forms, рассчитан ные на работу в общеязыковой среде выполнения. Кроме того, Microsoft разрабо тала для.NET Framework новую объектную модель доступа к данным Ч ADO.NET.

ADO.NET объединяет в себе вес лучшие стороны своих предшественниц и ре ализует функции, наиболее часто требуемые разработчикам: расширенную под держку XML, упрощенный доступ к отсоединенным данным, расширенные возмож ности управления обновлениями и повышенную гибкость обновлений.

Объектная модель ADO.NET Мы уже достаточно сказали о назначении ADO.NET и ее месте в архитектуре Visual Studio.NET, теперь самое время познакомить вас с этой технологией поближе. Здесь дается краткий обзор объектной модели ADO.NET и ее отличий от предыдущих технологий доступа к данным Microsoft.

Назначение ADO.NET Ч помогать разработке эффективных многоуровневых приложений для работы с БД в интрасетях и Интернете, для чего она и предос тавляет все необходимые средства. На рис. 1-1 показаны классы, составляющие объектную модель ADO.NET. Пунктирная линия делит модель на две части. Объекты в левой части называются подсоединенными (connected). Для управления соеди нением, транзакциями, выборки данных и передачи изменений они взаимодей ствуют непосредственно с БД. Объекты в правой части называются отсоединен ными (disconnected), они позволяют работать с данными автономно.

Отсоединенные объекты Подсоединенные объекты OataAdapter Рис. 1-1. Иерархия объектов ADO.NET Обзор ADO.NET ГЛАВА Пространства имен Пространство имен Ч это логическое объединение объектов. Размеры.NET Framework велики, и чтобы упростить разработку приложений на ее осно ве, Microsoft разделила объекты на пространства имен. На рис. 1-2 показа на часть иерархия пространств имен в,NET Framework, Рис. 1-2. Пространства имен в,NET Framework Самая частая причина использования пространств имен Ч профилак тика коллизий имен в сборках. Благодаря наличию разных пространств имен, программисты, работающие над разными компонентами, составляющими одно решение, могут использовать одинаковые имена для разных элемен тов. Поскольку эти имена разделены, в период компиляции они не мешают друг другу. Более практичное применение пространств имен Ч то, что груп пировка упрощает поиск объектов. Иногда я не помню точное имя нужно го мне объекта. Если бы в,NET Framework не было предусмотрено деление объектов на небольшие пространства имен, мне пришлось бы искать тре буемый объект в общем алфавитном списке. К счастью, я обычно знаю пространство имен необходимого мне объекта. Найти объект в нем гораз до проще, поскольку требуется просмотреть меньше записей, Подробнее об использовании пространств имен в Microsoft.NET Frame work и Visual Studio.NET Ч в документации AfSDN.

Объекты, составляющие отсоединенную часть модели ADO.NET. не взаимодей ствуют напрямую с подсоединенными объектами. Это Ч значительное отличие от предыдущих объектных моделей доступа к данным Microsoft. В ADO объект Recordset хранит результаты запросов. Можно вызвать его метод Open, чтобы вы брать результаты запроса, и затем с помощью метода Update (или UpdateBatcfo} передать изменения из Recordset в БД.

Объект DataSet ADO.NET (подробнее о нем Ч далее) по функциональности сравним с объектом Recordset ADO. Тем не менее DataSet не взаимодействует с БД.

Для выборки данных из БД в объект DataSet последний передают методу Fill под соединенного объекта ADO.NET Ч DataAdapter. Аналогичным образом для пере Часть I Основы работы с Microsoft ADO.NET дачи отложенных изменений из DataSet в БД объект DataSet нужно передать ме тоду DataAdapter-.Update.

Поставщики данных.NET Поставщик данных.NET Ч это набор классов, предназначенных для взаимодей ствия с хранилищем данных определенного типа..NET Framework включает два поставщика Ч SQL Client.NET Data Provider и OLE DB.NET Data Provider. Постав щик OLE DB.NET Data Provider позволяет взаимодействовать с различными хра нилищами данных посредством поставщика OLE DB. Поставщик SQL Client.NET Data Provider рассчитан исключительно на взаимодействие с БД SQL Server вер сии 7 или более поздней.

Каждый поставщик данных.NET реализует одинаковые базовые классы Ч Con nection, Command, DataProvider, Parameter и Transaction, конкретное имя которых зависит от поставщика. Так, у поставщика SQL Client.NET Data Provider есть объект SqlConnection, а у поставщика OLE DB.NET Data Provider Ч объект QleDbConnection.

Независимо от типа поставщика, объект Connection реализует одинаковые базо вые функции посредством одних и тех же базовых интерфейсов. Чтобы открыть соединение с хранилищем данных, создайте экземпляр объекта Connection постав щика, задайте значение свойства ConnectionString и затем вызовите метод Соп nection.Open.

У каждого поставщика данных.NET Ч собственное пространство имен. Оба поставщика из состава.NET Framework относятся к пространству имен SystemData, где находятся отсоединенные объекты. Поставщик OLE DB.NET Data Provider находится в пространстве имен SystemData.QleDb, а поставщик SQL Client.NET Data Provider Ч в пространстве имен SystemDataSqlCUent.

Поставщики данных.NET реализуют одинаковые базовые функции, и поэто му создаваемый вами код выглядит примерно одинаково вне зависимости от по ставщика. Как видно из следующих фрагментов кода, все, что требуется для пере хода от поставщика OLE DB.NET Data Provider к поставщику SQL Client.NET Data Provider, Ч заменить класс, экземпляр которого создается, и привести строку под ключения в соответствие требованиям поставщика, Visual Basic.NET 'Открываем и закрываем соединение 'с использованием поставщика OLE DB.NET Data Provider Dim cnQleOb As New OleDbConnection cnOleDb.ConnectionString = "Provider=SQLOLEDB;

"Data Source=(local);

InitialCatalog=Northwind;

..."

cndleDb.OpenO cnOleDb.CloseQ 'Открываем и закрываем соединение 'с использованием поставщика SQL Client.NET Data Provider Dim cnSql As New SqlConnection cnSql.ConnectiorStrinQ = "Data Source=(local);

" & "Initial Catalog=Northwind;

..."

ГЛАВА 1 Обзор ADO.NET cnSql.OpenO cnSql.Close() Visual C# //Открываем и закрываем соединение //с использованием поставщика OLE ВО.NET Data Provider OleDbConnection cnOleDb = new OleDbConnectionO;

enOleDb.ConnectionString = "Provider=Provider=SQLOLEDB;

"Data Source=(local);

InitialCatalog=Northwlnd;

...";

enOleDb.OpenO;

cnOleDb.Closef);

//Открываем и закрываем соединение //с использованием поставщика SQL Client.NET Data Provider SqlConnection cnSql = new SqlConnectionC);

cnSql,ConnectionString = "Data Source=(local);

" + "Initial Catalog=Northwind;

...";

cnSql.Open();

cnSql.Closet);

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

Повышенная производительность Как переход на использование поставщиков данных.NET повышает производи тельность? Создавая ADO-код, вы, по сути, используете интерфейсы ADO в каче стве посредника при взаимодействии с БД. Вы указываете ADO, какой постав щик следует использовать, и ADO передает ему все ваши вызовы. Поставщик вы полняет необходимые действия и возвращает вам результат через библиотеку ADO.

У поставщиков данных.NET промежуточный уровень отсутствует. Вы обраща етесь непосредственно к поставщику, и тот взаимодействует с хранилищем дан ных при помощи низкоуровневых интерфейсов программирования последнего.

Взаимодействие с SQL Server в ADO.NET при помощи поставщика SQL Client.NET Provider происходит быстрее, чем в ADO при помощи OLE DB-поставщика SQL Server, поскольку в ADO.NET задействовано на один уровень меньше.

Замечательные возможности расширения Когда в SQL Server 2000 появились функции для работы с XML-данными, команде разработчиков ADO пришлось решать интересную проблему. Для реализации в ADO функций, позволяющих выбирать XML-данные из БД SQL Server, требовалось до бавить новые интерфейсы в OLE DB API и поставщик SQL Server OLE DB Provider.

Часть I Основы работы с Microsoft ADO.NET Расширить функциональность поставщиков данных.NET гораздо проще. Им требуется поддерживать лишь единые базовые интерфейсы и при необходимос ти предоставлять дополнительные, специфические для отдельных поставщиков функции. Объект Command (SqlCommancf) поставщика SQL Client.NET Data Provider предоставляет такие же методы и свойства, как и его аналог в поставщике OLE DB.NET Data Provider, а также реализует метод для выборки содержимого запроса в виде XML-данных, Пролиферация В состав пакета Microsoft Data Access Components (MDAC) версии 2.0, появивше гося в июле 1998 г., входили OLE DB-поставщики для SQL Server, Microsoft Access и Oracle. Microsoft и другие команды разработчиков создали родные OLE DB-no ставщики для взаимодействия с другими хранилищами данных, однако такие поставщики существуют далеко не для всех хранилищ. Если вы работаете с ADO и не используете OLE DB-поставщик от Microsoft, высока вероятность того, что вы применяете ODBC-драйвер (технология, предшествовавшая OLE DB), коих ве ликое множество хотя бы из-за того, что их легко создавать. Многие разработчи ки сочли создание собственных OLE DB-поставщиков слишком сложным делом.

По сравнению с OLE DB-поставщиками и ODBC-драйверами написать постав щик данных.NET достаточно просто. Требуется реализовать меньше интерфей сов. Microsoft упростила процесс создания поставщиков для ADO.NET, чтобы об легчить разработчикам проектировку поставщиков данных.NET. Чем больше по ставщиков данных.NET, тем к большему числу различных источников данных можно обращаться средствами ADO.NET.

Обсуждение поставщиков данных.NET в этой книге Каждый поставщик данных.NET реализует одни и те же базовые интерфейсы, и поэтому рассматривать использование интерфейсов отдельных поставщиков дан ных.NET не требуется, В этой книге мы обсудим поставщик OLE DB.NET Data Provider. Я выбрал именно его потому, что он входит в состав.NET Framework, предоставляет базовые, независимые от поставщика функции и очень гибок в использовании Ч с его помощью удается взаимодействовать с любой БД, у кото рой есть родной OLE DB-поставщик. Рассматриваемые функции поставщика OLE DB.NET Data Provider также предоставляются и другими поставщиками, причем за исключением специально оговоренных случаев они работают аналогичным образом.

Подробнее о возможностях поставщиков данных.NET Ч в приложении Б. В главе 12 демонстрируются некоторые XML-функции ADO.NET, доступные при помощи поставщиков SQL Client.NET Data Provider и SQL XML.NET Data Provider.

Далее по тексту я буду называть объекты, общие для всех управляемых постав щиков, по имени, независимому от поставщика, например DataAdapter, а не OleDb DataAdapter или SqlDataAdapter.

Подсоединенные объекты Объектная модель ADO.NET включает классы, предназначенные для непосредствен ного взаимодействия с источником данных. Такие объекты, показанные на рис. 1- ГЛАВА 1 Обзор ADO.NET слева от пунктирной линии, я буду называть подсоединенными. Большинство из них представляют базовые концепции доступа к данным, например физическое соединение с БД, запрос и результаты запроса.

Объект Connection Объект Connection представляет соединение с источником данных. С помощью свойств этого объекта можно задать тип источника, его расположение и другие атрибуты. Объект Connection примерно эквивалентен объект)-' Connection ADO и объекту Database DAO, он применяется для соединения и отсоединения от БД.

Connection выступает в качестве канала, по которому другие объекты, например DataAdapter и Command, взаимодействуют с БД для передачи изменений и выборки их результатов.

Объект Command Объекты Command по структуре аналогичны объектам Command KDO и QueryDef ОАО. Они могут представлять запрос к БД, вызов хранимой процедуры или пря мой запрос на возврат содержимого конкретной таблицы.

БД поддерживают множество разных типов запросов. Одни запросы возвра щают записи данных, ссылаясь на одну или несколько таблиц или представлений или вызывая хранимую процедуру. Другие запросы изменяют записи данных, а все прочие Ч управляют структурой БД, создавая и изменяя такие объекты как таб лицы, представления и хранимые процедуры. С помощью объекта Command уда ется выполнить любой из этих запросов к БД.

Выполнение запроса к БД с использованием объекта Command осуществляет ся очень просто. Задайте свойству Connection одноименный объект, соединяющийся с БД, и затем задайте свойству CommandText текст запроса. Можно ввести обыч ный SQL-запрос, например:

SELECT CustomerlD, CompanyName, ContactName, Phone FROM Customers Можно также указать имя таблицы, представления или хранимой процедуры и средствами свойства CommandType задать тип выполняемого запроса. Объект Command позволяет выполнять запрос разными способами. Если запрос не воз вращает записи, вызовите метод ExecuteNonQuery. Метод ExecuteReader возвращает объект DataReader, позволяющий просматривать возвращенные запросом запи си. У объекта SqlCommand есть третий метод выполнения, ExecuteXmlReader, ко торый аналогичен методу ExecuteReader, но предназначен для работы с запроса ми, возвращающими результаты в формате XML Объекты DataReader Объект DataReader предназначен для максимально быстрой выборки и просмот ра возвращаемых запросом записей. Этот объект позволяет просматривать резуль таты запроса по одной записи за раз. При переходе к следующей записи содер жимое предыдущей записи отбрасывается. Объект DataReader не поддерживает обновление, и возвращаемые им данные доступны только для чтения. Поскольку DataReader реализует лишь ограниченный набор функций, он очень прост и имеет высокую производительность.

2- Основы работы с Microsoft ADO.NET 10 Часть I Объект Transaction Иногда несколько изменений содержимого БД требуется сгруппировать и обра батывать как единицу работы. В программировании БД такая единица называет ся транзакцией (transaction), Предположим, ваша БД содержит банковскую ин формацию и включает таблицы сберегательных и текущих счетов. Если пользо ватель захотел перевести денежные средства со сберегательного на текущий счет, в коде следует убедиться, что снятие средств со сберегательного счета и внесе ние их на текущий счет успешно завершились как одна единица работы или что не было сделано ни одного из изменений. Для этого и предназначена транзакция.

У объекта Connection есть метод BeginTransaction, позволяющий создавать объек ты Transaction. С помощью объекта Transaction удается подтвердить или отменить все коррективы, сделанные в ходе транзакции. В нашем примере изменения обо их счетов включены в одну транзакцию, и следовательно, эта процедура подтвер ждается или отмененяется как одна единица работы.

Объект Parameter Скажем, вам требуется выбрать из БД Orders все заказы конкретного клиента. Запрос выглядит так:

SELECT CustomerlD, CompanyName, CompanyName, Phone FROM Customers WHERE CustomerlD = 'ALFKI' Значение поля CustomerlD в разделе WHERE запроса зависит от клиента, зака зы которого требуется просмотреть. Однако при использовании такого запроса его текст придется менять каждый раз, когда потребуется просмотреть заказы другого клиента.

Чтобы упростить выполнение аналогичных запросов, можно заменить значе ние поля CustomerlD маркером параметра:

SELECT CustomerlD, CompanyName, CompanyName, Phone FROM Customers WHERE CustomerlD = ?

Затем, перед выполнением запроса, следует указать значение параметра. Мно гие разработчики интенсивно используют параметризованные запросы, поскольку они упрощают программирование и повышают эффективность кода.

Для применения параметризованного объекта Command создайте объекты Parameter, соответствующие всем параметрам запроса, и добавьте их в набор Parameters объекта Command. Объект Parameter ADQ.NE1 предоставляет свойства и методы, позволяющие определить тип данных и значение параметров. Для ра боты с хранимой процедурой, возвращающей данные посредством параметров вывода, задайте свойству Direction объекта Parameter соответствующее значение из перечисления ParameterDirection.

Объект DataAdapter Объект DataAdapter представляет новую концепцию моделей доступа к данным Microsoft;

у него нет близкого эквивалента в ADO и ОАО, хотя объекты Command ADO и QueryDefDAO можно считать его двоюродными братьями.

DataAdapter Ч это своеобразный мост между БД и отсоединенными объекта ми модели ADO.NET. Метод DataAdapter Fill предоставляет эффективный механизм ГЛАВА 1 Обзор ADO.NET выборки результатов запроса в объект DataSet или DataTable для последующей автономной работы с ними. Кроме того, объекты DataAdapter позволяют переда вать отложенные изменения из объектов DataSet в БД.

Объект DataAdapter ADO.NET предоставляет несколько свойств, фактически являющихся объектами Command. Так, свойство SelectCommand содержит объект Command, представляющий собой запрос для заполнения объекта DataSet. Кроме того, у DataAdapter есть свойства InsertCommand, UpdateCommand и DeleteCommand.

соответствующие объектам Command для передачи новых, измененных и удален ных записей в БД.

Эти объекты Command предоставляют функциональность обновления, кото рая в объектах Recordset ADO и ОАО была автоматической. Например, когда вы выполняете в ADO запрос для создания объекта Recordset, ядро курсоров ADO за прашивает у БД метаданные о запросе, чтобы определить происхождение резуль татов. Затем ADO на основе метаданных создает логику обновления, чтобы пре образовать изменения объекта Recordset в изменения содержимого БД, Так для чего же объекту DataAdapter ADO.NET требуются отдельные свойства UpdateCommand, InsertCommand и DeleteCommand"! Они позволяют определять собственную логику обновления. Функциональность обновления в ADO и ОАО достаточно ограничена в том плане, что обе объектные модели преобразуют из менения объектов Recordset в командные запросы, непосредственно ссылающие ся на таблицы БД. Для обеспечения безопасности и целостности данных многие администраторы БД ограничивают доступ к таблицам БД, позволяя изменять их содержимое только с помощью хранимых процедур. В отличие от объекта Data Adapter ADO.NET, модели ADO и DAO не умеют передавать изменения средствами хранимых процедур и не позволяют вам определить собственную логику обнов ления.

Свойствам UpdateCommand, InsertCommand и DeleteCommand объекта DataAdap ter можно задать вызов хранимой процедуры, изменяющей, добавляющей или удаляющей записи в соответствующей таблице БД. Затем следует вызвать метод DataAdapter.Update, и ADO.NET с помощью созданных вами объектов Command передаст изменения из DataSet в БД, Как уже говорилось, DataAdapter заполняет таблицы в объекте DataSet, а также считывает каптированные изменения и передает их в БД. У DataAdapter имеется несколько свойств, позволяющих вести мониторинг всех этих операций. Набор TableMappings Ч это свойство, позволяющее отслеживать сопоставление таблиц БД с таблицами DataSet. У каждого сопоставления таблиц имеется аналогичное свойство для сопоставления столбцов Ч набор ColumnMappings.

Отсоединенные объекты Вы узнали, как с помощью различных объектов поставщика данных.NET подклю читься к источнику данных, выполнить запросы и просмотреть их результаты. Тем не менее эти подсоединенные классы позволяют просматривать данные только в виде непозиционируемого, доступного только для чтения потока. Что, если вам требуется сортировать, выполнять поиск, фильтровать или изменять результаты запросов?

Часть I Основы работы с Microsoft ADO.NET Объектная модель ADO.NET включает классы, предоставляющие такую функ циональность. Они выступают в качестве автономного кэша данных. Выбрав ре зультаты запроса в объект DataTable (подробнее о нем Ч чуть далее), можно за крыть соединение с источником данных и продолжить работу с данными. Как уже говорилось, этим объектам не требуется живое соединение с источником данных, и поэтому они называются отсоединенными (disconnected objects).

Давайте рассмотрим отсоединенные объекты модели ADO.NET.

Объект DataTable Объект DataTable ADO.NET аналогичен объектам Recordset ADO и DAO. Он позво ляет просматривать данные в виде наборов записей и столбцов. Чтобы поместить результаты запроса в объект DataTable, применяют метод DataAdapterFill:

Visual Basic.NET Dim strSQL As String = "SELECT CustomerlD, CompanyName FROM Customers" Dim strConn As String = "Provider=SQLQLEDB;

Data Source=(local);

..."

Dim daCustomers As New 01eDbDataAdapter(strSQL, strConn) Dim tblCustomers As New DataTableO daCustomers,Fill(tblCustomers) Visual C# string strSQL = "SELECT CustomerlD, CompanyName FROM Customers";

string strConn = "Provider=SQLOLEDB;

Data Source=(local);

..."

OleDbDataAdapter daCustomers = new QleDbDataAdapterCstrSQL, strConn);

DataTable tblCustomers = new DataTableO;

daCustomers.Fill(tblCustomers);

Данные, выбранные из БД и помещенные в объект DataTable, считаются отсо единенными от сервера. Содержимое DataTable можно просматривать, не гене рируя сетевого трафика между ADO.NET и БД. При автономной работе с данны ми живое соединение с БД не требуется, но помните: вы также не увидите изме нений, внесенных другими пользователями после того, как вы выполнили исход ный запрос.

Класс DataTable содержит наборы других отсоединенных объектов, которые мы рассмотрим в последующих разделах. Для обращения к содержимому DataTable используют свойство Roivs, которое возвращает набор объектов DataRow. Чтобы просмотреть структуру DataTable, воспользуйтесь свойством Columns и получите набор объектов DataColumn. Класс DataTable также позволяет определять на сво ем содержимом различные ограничения, например первичный ключ. Обращать ся к этим ограничениям можно посредством свойства Constraints объекта DataTable.

Объект DataColumn У каждого объекта DataTable есть набор Columns, представляющий собой контей нер объектов DataColumn. Как видно из его названия, объект DataColumn соот ветствует столбцу таблицы. Тем не менее в действительности DataColumn содер жит не данные, хранящиеся в объекте DataTable, а информацию о структуре столбца.

Такая разновидность информации называется метаданными (metadata). Напри ГЛАВА 1 Обзор ADO.NET мер, объект DataColumn предоставляет свойство Туре, описывающее тип данных (скажем, string или integer) столбца. У DataColumn также есть другие свойства, например Readonly, AHowDBNutt, Unique, Default и Autolncrement, позволяющие управлять порядком обновления данных столбца, ограничить диапазон допусти мых значений поля и определить порядок генерации значений для новых запи сей данных.

Класс DataColumn также предоставляет свойство Expression, с помощью кото рого удается определить порядок вычисления данных в столбце. Распространен ная практика Ч основывать используемый в запросе столбец на выражении, а не на содержимом столбца таблицы БД. Например, в БД Northwind, поставляемой с большинством продуктов для работы с БД Microsoft, все записи таблицы Order Details содержат поля UnitPrice и Quantity. Если в структуру данных требуется добавить общую стоимость заказанных единиц товара, то обычно в запрос сле дует добавить вычисляемое поле. Следующий SQL-запрос определяет вычисляе мое поле с именем ItemTotal.

SELECT OrderlD, ProductlD, Quantity, UnitPrice, Quantity * UnitPrice AS ItemTotal FROM [Order Details] Недостаток такого способа в том, что БД вычисляет значение только при вы полнении запроса. Если изменить в объекте DataTable содержимое поля UnitPrice или Quantity, на значении поля ItemTotal это не отразится.

Класс ADO.NET определяет свойство Expression, позволяющее изящно разре шить данную ситуацию. Когда вы проверяете значение основанного на выраже нии объекта DataColumn, ADO.NET вычисляет это выражение и возвращает полу ченное значение. Таким образом, если обновить значение одного из используе мых в выражении столбцов, результат пересчитывается. Вот два фрагмента кода, демонстрирующих использование свойства Expression:

Visual Basic.NET Dim col As New DataColumnO With col.ColumnName = "ItemTotal".DataType = GetType(Decimal).Expression = "UnitPrice * Quantity" End With Visual C# QataColumn col = new DataColumnO;

col,ColumnName = "ItemTotal";

col.DataType = typeof(Decimal);

col.Expression = "UnitPrice * Quantity";

Набор Columns и объекты DataColumn можно ориентировочно сопоставить набору Fields и объектам Field ADO и DAO.

Часть I Основы работы с Microsoft ADO.NET Объект Constraint Класс DataTable также позволяет определять на локальном содержимом объектов DataTable различные ограничения. Например, можно создать объект Constraint, гарантирующий, что значений поля или нескольких полей будут уникальны в пределах DataTable. Объекты Constraint хранятся в наборе Constraints объекта DataTable.

Объект Dataflow Обратиться к реальным значениям, хранящимся в объекте DataTable, позволяет набор Rows, содержащий объекты DataRow. Чтобы просмотреть содержимое кон кретного поля определенной записи, воспользуйтесь свойством Нет соответству ющего объекта DataRow и считайте значение нужного поля. Класс DataRow пре доставляет несколько перегруженных определений свойства Пет. Выбрать поле для просмотра можно, передав свойству Item объекта DataRow имя, порядковый номер или сопоставленный с полем объект DataColumn. Item Ч свойство объекта DataRow по умолчанию, и поэтому его разрешается использовать неявно:

Visual Basic.NET Dim row As DataRow row = MyTable.Rows(O) Console.WriteLine(row(O)) Console.WriteLine(row("CustomerlD"}) Console.WriteLineC row(MyTable.Columns("Customs rID"))) Visual C# DataRow row;

row = MyTable.Rows[0];

Console.WriteLineCrow[0]);

Console.WriteLine(row["CustomerlD"]);

Console.WriteLineCrow[MyTable.Columns["CustomerlD"]]);

Вместо того чтобы вернуть содержимое только текущей записи, DataTable пре доставляет через набор Rows содержимое всех записей данных. Это заметно от личается от поведения объектов Recordset ADO и DAO, которые предоставляют одновременно только одну запись данных и требуют перемещаться по их содер жимому с помощью методов типа MoveNext. Следующий фрагмент кода в цикле перемещается по содержимому объекта Recordset ADO:

Классический Visual Basic Dim strConn As String, strSQL As String Dim rs As ADODB.Recordset strConn = "Provider=SQLOLEDB;

Data Source=(local);

..."

strSOL = "SELECT CustomerlD, CompanyName FROM Customers" Set rs = New ADODB.Recordset rs.CursorLocation = adUseClient rs.Open strSQL, strConn, adOpenStatic, adLockReadOnly, adCmdText Do While Not rs.EOF ГЛАВА 1 Обзор ADO.NET MsgBox rs("CustomerID") rs.MoveNext Loop Для просмотра содержимого объекта DataTable ADO.NET следует перемещаться по объектам DataRow из набора Rows-.

Visual Basic.NET Dim strSOL, strConn As String Dim da As New 01eDbDataAdapter(str$QL, strConn} Dim tbl As New DataTableO da.Fill(tbl) Dim row As DataRow For Each row In tbl.Rows Console.WriteLine(row(0}) Next row Visual C# string strSQL, strConn;

OleDbDataAdapter da = new OleDbDataAdapterfstrSQL, strConn);

DataTable tbl = new DataTableO;

da.Fill(tbl);

foreach (DataRow row in tbl.Rows) Console.WriteLine(row[0]);

Объект DataRow является также отправной точной обновления. Например, можно вызвать метод DataRowBeginEdit, изменить посредством свойства Item зна чение одного из полей записи и затем вызвать метод EndEdit, чтобы сохранить сделанное изменение. Метод CancelEdit объекта DataRow отменяет все изменения, сделанные за текущий сеанс редактирования. Кроме того, DataRow предоставля ет методы для удаления элементов из набора Rows, Когда вы изменяете содержимое записи, DataRoiv кэширует эти изменения, чтобы позже передать их в БД. Таким образом, при изменении значения поля за писи DataRow хранит оригинальное и текущее значения поля, что обеспечивает успешное обновление содержимого БД. При наличии отложенных изменений свой ство Item объекта DataRow позволяет просматривать оригинальные значения полей.

Объект DataSet Как следует из имени, объект DataSet содержит набор данных. DataSet можно рас сматривать в качестве контейнера объектов DataTable (хранящихся в наборе Tables объекта DataSet). Помните: ADO.NET предназначена упростить разработку круп ных многоуровневых приложений для работы с БД. Иногда требуется обратиться к компоненту на промежуточном сервере и выбрать содержимое нескольких таб лиц. Вместо того чтобы многократно обращаться к серверу и выбирать данные по одной таблице за раз, можно поместить все данные в объект DataSet и вернуть Часть I Основы работы с Microsoft ADO.NET его за один вызов. Тем не менее объект DataSet Ч нечто больше, чем просто кон тейнер объектов DataTable.

Данные в объекте DataSet отсоединены от БД. Все изменения данных просто кэшируются в объектах DataRow. Когда придет время передать эти изменения в БД, вероятно, окажется неэффективным пересылать промежуточному серверу весь объект DataSet, Стоит воспользоваться методом GetChanges и извлечь из DataSet лишь измененные данные. В результате снизится объем данных, передаваемых между процессами и серверами.

Объект DataSet также предоставляет метод Merge, дополняющий метод GetCban ges. Сервер промежуточного уровня, с помощью которого вы передаете измене ния в БД, может, используя возвращенный методом Merge объект DataSet, вернуть DataSet с только что выбранными из БД данными. Метод Merge позволяет объеди нить содержимое двух DataSet в один объект. Это еще один пример, подтвержда ющий, что при разработке ADO.NET учитывалась архитектура многоуровневых приложений. В предыдущих моделях доступа к данным Microsoft аналогичной функции нет.

Создать объект DataSet и заполнить его набор Tables удается и без взаимодей ствия с БД. В предыдущих моделях доступа к данным перед локальным добавле нием новых записей требовалось сначала выполнить запрос к БД и затем позже передать эти новые записи в БД. В ADO.NET взаимодействие с БД требуется толь ко тогда, когда необходимо передать новые записи.

Кроме того, DataSet предоставляет функции чтения и записи в файл и область памяти. Можно сохранить только содержимое объекта DataSet, только его струк туру или и то, и другое. ADO.NET хранит эти данные в виде XML-документа. По скольку ADO.NET и XML тесно связаны, перенос данных из объектов DataSet ADO.NET в XML-документы и обратно осуществляется очень быстро. Это позволяет восполь зоваться одной из наиболее мощных функций языка XML Ч его способностью легко преобразовывать структуру данных. Так, применив XSLT-шаблон, удается преоб разовать данные XML-документа в HTML-код.

Объект DataRelation Обычно таблицы БД тем или иным образом связаны между собой. Например, в БД Northwind каждой записи таблицы Orders соответствует запись таблицы Custo mers, что позволяет определить, кто какие заказы разместил. В приложении вам, скорее всего, потребуется использовать связанные данные из нескольких таблиц.

Для решения этой задачи применяют объект DataRelation, предоставляемый объек том DataSet, Класс DataSet определяет свойство Relations, представляющее собой набор объектов DataRelation. Объект DataRelation позволяет определить отношение между объектами DataTable из состава DataSet. Создав объект DataRelation, с помощью аналогичного следующему кода выбирают массив объектов DataRow с записями о заказах, размещенных конкретным клиентом:

Visual Basic.NET Dim dsNorthwind As DataSet Dim rowCustomer, rowOrder As DataRow ГЛАВА 1 Обзор ADO.NET 'Код, создающий объект DataSet dsNorthwind.Relations.Add("CustomersOrders", dsNorthwind.Tables("Customers"). ColumnsC "CustomerlD"), dsNorthwind.Tables( "Orders"), ColumnsC''CustomerlD")) For Each rowCustomer In dsNorthwind.Tablesf"Customers").Rows Console.WriteLineC'Orders for customer " 4 rowCustomer("CompanyName")) For Each rowOrder In rowCustomer.GetChildRows("CustomersOrders") Console.WriteLine(vbTab 4 rowOrder("OrderID"}) Next rowOrder Next rowCustomer Visual C# DataSet dsNorthwind;

//Создаем и инициализируем объект DataSet dsNorthwind,Relations.Add("CustomersQrders", dsNorthwind. Tables["Customers"].Coluinns["CustomerlD"], dsNorthwind. Та t)les["Orders"].ColtJmns["CustomerID"]);

foreach (DataRow rowCustomer in dsNorthwind.Tables["Customers"].Rows) { Console.WriteLine("Orders for customer " Х+ rowCustomer["CompanyName"].ToString());

foreach (DataRow rowOrder in rowCustomer.GetChildRows("CustomersOrders")) Console.WriteLine('\f + rowOrder["OrderID"].ToString());

} Кроме того, объекты DataRelation предоставляют свойства, позволяющие обес печить ссылочную целостность. Например, DataRelation можно сконфигурировать так, чтобы изменение значения первичного ключа родительской записи автома тически каскадировалось дочерним записям. Объект DataRelation, кроме того, удается настроить таким образом, что при удалении записи в родительском объекте DataTable автоматически удаляются соответствующие записи дочернего объекта DataTable, Объект DataView Выбрав результаты запроса в объект DataTable, можно посредством объекта Data View просматривать это содержимое разными способами. Если содержимое Data Table требуется упорядочить по определенному полю, задайте имя этого поля свой ству Sort объекта DataView. Кроме того, свойство Filter объекта DataView позволит вам выводить только записи, удовлетворяющие заданным критериям.

Просматривать содержимое одного объекта DataTable можно одновременно посредством нескольких объектов DataView. Предположим, у вас на форме есть две сетки: одна с упорядоченным по алфавиту полным списком клиентов, а дру гая Ч с тем же списком, но упорядоченным по другому полю, например по обла Часть I Основы работы с Microsoft ADO.NET era или по городу. Для вывода представлений свяжите обе сетки с разными объек тами DataView, ссылающимися на одинаковый объект DataTable. Благодаря этой возможности, исключается необходимость хранить две одинаковые копии дан ных в разных структурах. Подробнее об этом Ч в главе 8.

Метаданные ADO и ОАО позволяют создавать объект Recordset на основе результатов, возвра щенных запросом. Ядро доступа к данным просматривает столбцы данных набо ра результатов и на основе этой информации заполняет набор Fields, объекта Recordset, задавая имена, типы данных и т.д.

ADO.NET предоставляет вам альтернативу. Можно написать пару строк кода и предоставить ADO.NET автоматически определять структуру результатов или на писать код большего объема, включающий метаданные о структуре результатов вашего запроса.

Почему выбирают способ, при котором требуется писать больший объем кода?

В основном из-за расширенной функциональности и повышенной производитель ности. Но как больший объем кода повышает производительность приложения?

Это не очевидно, так ведь?

При создании программ, отличных от средств выполнения произвольных зап росов, вам обычно известна структура набора результатов вашего запроса. Напри мер, большая часть ADO-кода выглядит так:

Dim rs as Recordset 'Объявляем прочие переменные 'Инициализируем переменные и открываем соединение с БД rs.Open strSQL, cnDatabase, adOpenStatic, adLockdptiroistic, adCmdText Do While Not rs.EOF Listl.Addltem rs.Fields("UserName").Value rs.MoveNext Loop В данном случае программист знает, что запрос содержит столбец UserName, Смысл в том, что вы, как разработчик, обычно имеете представление, какие стол бцы и с каким типом данных вернет ваш запрос. Тем не менее ADO заранее неиз вестно, как будут выглядеть результаты запроса. А значит, ей приходится обращаться к OLE DB-поставщнку и задавать вопросы типа Сколько столбцов в наборе ре зультатов запроса?, Каковы типы данных этих столбцов?, Происхождение дан ных? и Какие поля первичного ключа таблиц упомянуты в запросе?.

Поставщик может ответить на некоторые из этих вопросов, но в большинстве случаев ему приходится обращаться к БД.

Для выборки результатов запроса и помещения их в объект DataSet ADO.NET должна знать ответы. Их можно дать самостоятельно или указать ADO.NET обра титься к поставщику. В первом случае производительность кода окажется выше, поскольку ADO.NET не придется запрашивать эти сведения у поставщика в пери од выполнения.

Написание кода для подготовки структуры объекта DataSet может стать очень утомительной задачей, хотя и позволяет повысить производительность приложения.

ГЛАВА 1 Обзор ADO.NET К счастью. Visual Studio.NET включает предоставляемые на этапе разработки сред ства доступа к данным, объединяющие в себе лучшие стороны обоих способов.

Так, можно создать DataSet на основе запроса, имени таблицы или хранимой процедуры, и затем мастер конфигурирования сгенерирует ADO.NET-код, необ ходимый для выполнения запроса и передачи изменений в БД. Подробнее об этом Ч в последующих главах книги.

Объекты DataSet со строгим контролем типов Visual Studio.NET упрощает разработку приложений для доступа к данным, гене рируя объекты DataSet со строгим контролем типов. Предположим, у нас есть простая таблица Orders со столбцами CustomerlD и CompanyName. Писать код, аналогичный показанному ниже, не требуется.

Visual Basic.NET Dim ds As DataSet 'Создаем и заполняем объект DataSet Console. WriteUne(ds.Tables("Customers").Rows(0)( "CustofnerlD")) Visual C# DataSet ds;

//Создаем и заполняем объект DataSet Console. WriteLine(ds.Tables["Customers"].Rows[0]["CustomerlD"]);

Вместо этого можно написать такой код:

Visual Basic.NET Dim ds As CustomersDataSet 'Создаем и заполняем объект DataSet Console,WriteLine(ds.Customers(0).CustomerlD) Visual C# CustomersDataSet ds;

//Создаем и заполняем объект DataSet Console. Writel_ine(ds.Customers[0]. CustomerlD);

Объект DataSet со строгим контролем типов Ч это просто класс, создаваемый Visual Studio.NET и предоставляющий информацию о таблицах и столбцах по средством свойств. Кроме того, объекты DataSet со строгим контролем типо.в предоставляют нестандартные методы для таких действий, как создание новых записей. Таким образом, вместо следующего кода:

Visual Basic.NET Dim ds as DataSet 'Код, создающий объект DataSet 'и объект DataTable под названием Customers Dim rowNewCustoroer As Dataflow rowNewCustomer = ds.Tables("Customers").NewRow() Основы работы с Microsoft ADO.NET 20 Часть I rowNewCustomer("CiistomerID") = "ALFKI" rowNewCustomer("CompanyName") = "Alfreds Futterkiste" ds,Tables("Customers").Rows.Add(rowNewCustomer} Visual C# DataSet ds;

//Код, создающий объект DataSet //и объект DataTable под названием Customers Dataflow rowNewCustomer;

rowNewCustome г = ds.Tablest"Custome rs"].NewRow();

rowNewCustomer["CustomerID"] = "ALFKI";

rowNewCustomerfCompanyName"] = "Alfreds Futterkiste";

ds.Tables["Customers"].Rows.Add(rowNewCustomer);

создать и добавить новую запись в таблицу можно посредством одной строки кода:

ds.Customers,AddCustomersRow("ALFKI", "Alfreds Futterkiste") Подробнее об объектах DataSet со строгим контролем типов Ч в главе 9 Вопросы, которые стоит задавать почаще Несмотря на свое название, модель ADO.NET мало похожа на ADO. И хотя ADO.NET содержит классы, позволяющие подключаться к БД, выполнять запросы и полу чать их результаты, эта объектная модель сильно отличается от ADO. Вы уже зна ете о многих отличиях. Далее я рассмотрю основные объекты иерархии ADO.NET.

Однако для начала проясню некоторые вопросы, наиболее часто возникающие у разработчиков, только что перешедших на ADO.NET, Вопрос. Почему нет ни "слова о курсорах?

Ответ. В первом выпуске ADO.NET серверные курсоры не поддерживаются. Воз можно, их поддержка будет реализована в будущих версиях. В данный момент ни один из объектов иерархии ADO.NET не является интерфейсом серверного кур сора. Объекты DataSet и DataTable соответствуют скорее клиентскому объекту Recordset ADO. Объект DataReader Ч серверному объекту Recordset ADO, исполь зующему непозиционируемый, доступный только для чтения курсор.

Вопрос. Как задать текущее положение в объекте DataTable средствами ADO.NET?

В предыдущих моделях доступа к данным имелись методы типа MoveFirst, MoveNext и т.д. Где же свойства позиционирования и методы перемещения?

Ответ. Объект DataTable предостаапяет набор Rows, позволяющий в любое вре мя ссылаться на любую запись таблицы;

следовательно, DataTable не поддержи вает концепцию текущей записи. Поскольку к любой записи можно обращаться напрямую, потребность в свойствах позиционирования и методах перемещения типа MoveFirst, MoveLast, MoveNext и MovePrevious отпадает.

В ADO свойства позиционирования и методы перемещения обычно исполь зовались при выводе данных на форме.

ГЛАВА Создание ADO.NET-приложений с помощью мастера DataForm Wizard Структура многих книг для разработчиков такова: сначала в нескольких главах рассматриваются отдельные фрагменты кода и лишь затем на их основе создаст ся несложное работоспособное приложение. Я решил изменить логику изложе ния и прямо в этой главе покажу, как быстро и просто создать приложение, де монстрирующие часть основных возможностей Microsoft ADO.NET, Все без ума от примеров Из конференций, в которых мне пришлось участвовать и выступать, я понял, что все разработчики, особенно использующие Microsoft Visual Basic, без ума от при меров, И правда, гораздо проще обсуждать возможности кода, предварительно увидав его в действии. Именно поэтому я начинаю главу с примера.

Мастер Data Form Wizard из Visual Studio.NET позволяет легко, буквально в несколько этапов, создать связанную с данными форму. Сейчас я создам форму, позволяющую получать из БД данные, просматривать и изменять их и затем пе редавать изменения в исходную БД. Далее я кратко разберу генерируемый масте ром код Ч- это будет своего рода анонс следующих глав. Созданное приложение я использую в качестве рабочего примера при описании многих объектов, функ ций и концепций, о которых пойдет речь в следующих главах книги.

Часть I Основы работы с Microsoft ADO.NET Примечание Мастера раздражают многих разработчиков. Возможно, раздра жают* Ч слишком сильное слово, но разработчики, по крайней мере, не доверяют мастерам, особенно использующим технологии черного ящи ка*. К счастью, мастер Data Form Wizard из Visual Studio.NET генериру ет код, который можно просматривать и изменять.

В этой главе я расскажу о том, как создать простое приложение на основе БД Northwind, поставляемой с такими программными продуктами, как Microsoft SQL Server, Microsoft Access и Microsoft Data Engine (MSDE). В зависимости от программы или ее версии, структура БД Northwind различается, но всегда содержит таблицы Customers, Orders, Products и Employees. Чтобы создать приложение, о котором пойдет речь, вам потребуется доступ к БД Northwind.

Создание связанной с данными формы средствами мастера Data Form Wizard Б проект Visual Studio.NET разрешено добавлять различные объекты, например формы, модули классов и модули кода. В проекты Visual Basic.NET и С* можно также добавлять связанную с данными форму. При этом Visual Studio автомати чески запускает мастер Data Form Wizard.

В последовательно открываемых мастером диалоговых окнах вам предлагает ся ввести информацию о БД, ее таблицах, полях таблиц и т.д. Далее об этом я расскажу подробно.

Во-первых, в меню File среды Visual Studio.NET выберите New\Project или щелкните кнопку Project в панели инструментов. Откроется диалоговое окно New Project. В панели Project Types выберите нужный язык программирования Ч Visual Basic или Visual С* Ч и затем щелкните значок Windows Application (рис. 2-1). В текстовом поле под значками наберите имя создаваемого проекта, Chapter2, и щелкните ОК.

Project Types:

ь р vsuarf Basic Projects | &1 Visual C# Projects jj Setup and Deployment Protects>

j D:\Documents and 5ettings\C)ayidScl.My Documents^, -j Project win be created at 0:\...\Сау1с13с\Му Doajmerits\ViijiJ Studio Projacts^Chaptвг2, I I ;

1 j *More I OK Cancel Рис. 2-1. Создание нового Windows-приложения ГЛАВА 2 Создание ADO.NET-лриложений с помощью мастера DataForm Wizard Примечание При создании Web-формы используются более сложные концеп ции, о них пойдет речь в главе 14- Здесь для простоты я предлагаю со здать связанную с данными Windows-форму.

Теперь воспользуемся возможностями мастера Data Form Wizard. Поскольку-' при работе с мастером в проект добавляется новая форма, мастер запускают из диа логового окна Add New Item. Чтобы открыть это окно, выберите из меню File среды Visual Studio.NET команду New или щелкните кнопку Add New Item в панели инст рументов. После этого щелкните значок Data Form Wizard (рис. 2-2) и затем Ч ОК.

AddNew Item - Chapter?

Templates:

Windows Form>

Рис. 2-3. Начальное окно мастера Data Form Wizard Часть I Основы работы с Microsoft ADO.NET Щелкните Next. В следующем диалоговом окно появится предложение исполь зовать имеющийся объект DataSet или создать новый. Поскольку объектов DataSet еще нет, создайте новый (рис. 2-4), Choose thE dataset vU want to use The dataset contains [he tflbles and columns to wQ'k with in уст Рис. 2-4. Создание нового объекта DataSet для новой формы Имя объекта DataSet должно отражать тип его данных. В нашем примере DataSet содержит таблицы Customers и Orders БД Northwind, так что вам следует задать ему имя CustomersAndOrders. Щелкните Next.

Примечание Мастер Data Form Wizard создает объекты DataSet с жестким кон тролем типов и добавляет их в проект в виде новых файлов классов. В связи с этим имя объекта DataSet всегда должно быть допустимым име нем класса, т. е. начинаться с буквы и включать только буквы, цифры и символы подчеркивания.

Выбор подключения Теперь пора подключить маетер Data Form Wizard к вашей БД. В окне Choose A Data Connection (рис. 2-5) можно выбрать новое или уже существующее, доступ ное в окне Server Explorer, подключение. Если вы еще не создавали подключение к БД, щелкните New Connection. Откроется диалоговое окно OLE DB Data Link Properties.

На вкладке Connection окна OLE DB Data Link Properties можно задать пара метры подключения. По умолчанию создается подключение к Microsoft SQL Server.

Чтобы подключиться к БД, укажите имя сервера [или наберите (local) для взаи модействия с локальным экземпляром SQL Server], имя пользователя, пароль и имя БД (рис. 2-6).

Чтобы выбрать нужный экземпляр на компьютере с несколькими экземпляра ми SQL Server, введите имя машины, обратную косую черту и имя экземпляра, например Имя^1оегоСервера\ИмяМоегоЭкземг11яра, ГЛАВА 2 Создание ADO.NET-приложений с помощью мастера DataForm Wizard Вяе Гпт Wizard a data connection Which tdfine с hon ihcm Id the fvteard иь Рис. 2-5- Диалоговое окно Choose A Data Connection Рис. 2-6. Вкладка Connection окна OLE DB Data Link Properties Примечание По умолчанию пароль учетной записи администратора SQL Ser ver Ч пустой. В целом это не слишком удачная идея, и по соображени ям безопасности пароль рекомендуется изменить. Кроме того, при со здании приложений для работы с БД SQL Server не рекомендуется реги стрировать пользователей под учетной записью администратора. Создай те отдельные учетные записи пользователей или одну общую учетную запись и назначьте им соответствующие разрешения. Следует позаботить ся о том, чтобы пользователи случайно или намеренно не внесли в БД необратимые изменения.

Заметьте: на рис. 2-7 помечен флажок Allow Saving Password. По умолчанию он снят. Если вы, используя параметры по умолчанию, введете пароль, Visual Studio.NET получит всю строк}' подключения, кроме пароля. В результате при каждом обращении к БД в период разработки вам придется вводить пароль. Я предпочи Часть I Основы работы с Microsoft ADO.NET таю помечать этот флажок, удаляя тем самым пароль из строки подключения в коде приложения. Сейчас же пометьте данный флажок. Подробнее об этом Ч в главе 3.

Чтобы подключиться к БД, отличной от SQL Server, перейдите на вкладку Provider и выберите нужный поставщик OLE DB. Здесь перечислены все установленные на вашем компьютере поставщики OLE DB. Подробнее о подключении к другим по ставщикам средствами окна Data Link Properties Ч в следующей главе.

osoT SAM 1 1 OLE OB Piovida EBDttJelDS' CLE DE PfOYidfr osofUet 4 0 OLE OB Provider cionCLEUEPrc.:;

aCT- Fa.

osoft OLE И F-svdtr foi lnde

Хosofl OLE DE Piovidoi for ODBC Сил о;

;

\ OLE DB Prouder lor OLAF SF v [ВОН OLE С В P'OYioer ft Clлj Servit " u C O L F L В F:n,.dei for Oracle Рис. 2-7. Вкладка Provider окна OLE DB Data Link Properties Если у вас нет доступа к БД SQL Server или MSDE, а есть Ч лишь к Access-вер сии БД Northwmd, выберите поставщик Microsoft Jet 4.0 OLE DB.

Щелкните Next, чтобы перейди на вкладку Connection (рис. 2-8).

Рис. 2-8. Выбор БД Access на вкладке Connection окна OLE DB Data Link Properties В первом текстовом поле наберите путь к БД Access иди щелкните кнопку (...) справа от текстового поля Ч откроется диалоговое окно, где можно выбрать БД ГЛАВА 2 Создание ADO.NET-приложений с помощью мастера DataForm Wizard на локальном или сетевом диске. Наберите в соответствующих полях имя пользо вателя и пароль и при необходимости пометьте нужные флажки управления па ролем. Щелкните ОК.

Выбор таблиц БД В диалоговом окне Choose Tables Or Views мастера Dara Form Wizard (рис. 2-9) перечислены доступные в схеме БД таблицы, представления и хранимые проце дуры. Хотя таблицы и представления обрабатываются в разных СУБД как разли чающиеся структуры, вывод любого из этих объектов сопоставляется с объектом DataTable ADO.NET. Таким образом, мастер ссылается на все объекты, как на таб лицы.

Выберите в списке Available Items нужные таблицы и переместите их в список Selected Items, щелкнув кнопку с направленной вправо стрелкой. Если вы ошиб лись и хотите удалить какие-то таблицы из списка Selected Items, выберите их и щелкните кнопку со стрелкой влево. Кроме того, добавлять и удалять таблицы можно, дважды щелкнув их название мышью.

Ltioose tables or views Wftal Hirm iui itcaaj

Создание отношений в объекте DataSet Если вы укажете несколько таблиц, откроется диалоговое окно, позволяющее определить отношения между ними. Как я говорил в главе 1, отношения упроща ют поиск данных в связанных таблицах. Кроме того, они обеспечивают соблюде ние правил ссылочной целостности, каскадно передавая изменения от одной таб лицы к другой, Определить отношение в объекте DataSet средствами мастера Data Form Wizard очень просто, Самая сложная часть данного процесса Ч по-видимому, выбор имени отношения. Обычно имя рекомендуется составлять из имен родительской и до черней таблиц (именно в таком порядке).

Далее я покажу, как связать таблицы Customers и Orders. В качестве имени от ношения я выберу CustomersOrders.

Часть I Основы работы с Microsoft ADO.NET Данные двух таблиц взаимосвязаны. Каждая запись таблицы Orders связана с записью таблицы Customers. Иначе говоря, каждый заказ относится к конкретно му клиенту. Поскольку с каждой записью о клиенте связана запись о заказе, роди тельской таблицей в отношении считается Customers.

Выберите таблицу Customers в качестве родительской и Orders Ч в качестве дочерней. Поле CustomerlD определяет связь между этими двумя таблицами;

ука жите его в качестве ключевого поля обеих таблиц (рис. 2-10). Щелкните кнопку со стрелкой вправо, чтобы добавить отношение в список Relations, и затем щелк ните Next.

Create a relationship between table The №zard wiH ute hhe relationshtps 'o gerie'ate code tbac keeps he ^ ^^ Рис. 2-10. Определение отношений между таблицами Выбор отображаемых столбцов В диалоговом окне Choose Tables And Columns To Display On The Form мастера Data Form Wizard (рис. 2-11) можно выбрать столбцы, отображаемые на связанной с данными форме. Когда вы назначали таблицы для объекта DataSet, у вас не было возможности указать нужные столбцы Ч мастер Data Form Wizard получил все записи и все столбцы выбранных таблиц.

Можно отобразить одну или две таблицы из отношения master/detail. После того как вы укажете нужные таблицы, появится перечень их столбцов. По умол чанию выбраны все столбцы;

флажки столбцов, которые вы не хотите отображать на связанной с данными форме, можно снять.

В открывшемся окне Choose Tables And Columns To Display On The Form табли ца Customer выбрана в качестве родительской, а таблица Orders Ч в качестве до черней. Это Ч приятный результат конфигурации мастера по умолчанию, согласно которой родительской таблицей назначается первая таблица по алфавиту. Посколь ку Customers стоит раньше Orders, она по умолчанию назначается в качестве родительской. С Customers связана только одна таблица Ч Orders, которая и бу дет по умолчанию указана в качестве дочерней.

Чтобы упростить вид формы, выберите столбцы CustomerlD, CompanyName, ContactTitle и Phone таблицы Customers и столбцы CustomerlD, EmployeelD и Order Date таблицы Orders. Затем щелкните Next.

Создание ADO.NET-лриложений с помощью мастера DataForm Wizard ГЛАВА linfa [nrni Wizard Choose tables and column: to display on the form Your fan can display any offhe tables ana cofcurrs e^adaure in Ч you olspdav more Chan э^е table on the form, [he tetdes ha*E a f attBi чЬНогвпв What latikt and cokimn do you font la Unptat anlhtlarm'. ContaclTI* OrdHOate I,. I, '. Address Рис. 2-И. Назначение таблиц и столбцов, отображаемых на связанной с данными форме Выбор стиля отображения Теперь мастер предложит вам определить, как следует отображать содержимое основной таблицы на связанной с данными Windows-форме. Так, можно вывести это содержимое в сетке, чтобы пользователь мог одновременно просматривать несколько записей или выводить записи по одной, использовав набор связанньгх с данными элементов управления, таких, как текстовые поля.

Во втором случае мастер предоставляет больше возможностей настройки па раметров отображения. Вы можете добавить на форму кнопки для перемещения по содержимому таблицы, отмены ожидающих изменений записи, а также для добавления и удаления записей. Чтобы получить результат, аналогичный моему, щелкните переключатель Single Record In Individual Controls и пометьте все флажки, показанные на рис. 2-12.

Choose ihe display style VOLT can drsplay a fjivjle record a', a flte or dsaar all records.

ни* do уом ivant taduplay >4rifat4?

'" ЛЛ emrd!EИ a ett i* S"ffл record f rpdvKkwT confrcdj What nddKkmel taitralt da yau ant an the farm' * СвЧе* * В ЙЯ 0 *1**П, * | - *ЛВ Ш * Я 1| ** * If you select mdMdual conBolt. you ;

sл controls fW edUS "nil n*3at(on:

л Sл в*1-С!И8М(ЛП[П>ГО!0.

-v fjeiefe - Dria№ (he curent record.

ХV Cancel- Сй-т?1& changл to ^hecurreriT'et^u.

*Х" risiatm tonlrolj - Moлs loAVsl, BSVBUS, nejl. or Ийпяогй.

Рис. 2-12. Выбор стиля отображения содержимого таблицы Основы работы с Microsoft ADO.NET 30 Часть I Примечание В случае с Web-приложением мастер создает объекты DataGrid, которые преобразуют содержимое ваших таблиц в HTML-таблицы для отображения на форме.

Вот и все. Щелкните Finish, чтобы создать новую связанную с данными форму Использование новой связанной с данными формы На рис. 2-13 показана связанная с данными форма, созданная мастером Data Form Wizard.

аx -.ipre,:

Ddtahurml.xbLLkr^ignl | ^ CiisWrper5flndOr6eis ^1 fesehiblylnfo.vl:

US DotSomlL,* S FO.nl vb jCaUforml Er*en'.V1nifc:

I ЬсмШсШпс AccsiSibleRulf i OleDbConneaionl % CfeDbPataAdapteг I Рис. 2-13. Новая, связанная с данными форма Рис. 2-14. Диалоговое окно свойств проекта Chapter Создание ADO.NET-приложений с помощью мастера DataForm Wizard ГЛАВА Собрав и запустив проект прямо сейчас, вы не увидите новой связанной с дан ными формы. Если вы не изменяли параметров проекта, отобразится только форма, с самого начала имевшаяся в проекте. Чтобы изменить параметры для отображе ния новой формы, выберите из меню Project среды Visual Studio.NET команду Properties или щелкните в окне Solution Explorer проект правой кнопкой и выбе рите Properties. Откроется диалоговое окно Property Pages. В раскрывающемся списке Startup object укажите DataForm 1 (рис. 2-14). Щелкните ОК, чтобы сохра нить изменения, Отображение данных в связанной форме Чтобы запустить проект и увидеть новую связанную с данными форму, нажмите клавишу F5;

выберите из меню Debug команду Start или щелкните кнопку Start в панели инструментов, Вы увидите, что на форме имеются метки и текстовые поля для всех полей таблицы Customers, а также связанная с данными сетка для ото бражения содержимого таблицы Orders. Однако никаких данных нет. Все элементы управления пусты. Форма создала объект DataSet с таблицами и отношением, определенным средствами мастера Data Form Wizard, причем абсолютно пустой.

Щелкните кнопку Load Б левом верхнем углу формы, и в элементах управления появятся данные (рис. 2-15).

Рис. 2-15. Просмотр данных в новой связанной форме Изучаем сгенерированный мастером код Чтобы просмотреть код, выполняемый проектом при щелчке кнопки Load, закройте форму и вернитесь в среду Visual Studio.NET. Дважды щелкнув кнопку Load, вы увидите, что код ее события Click вызывает процедуру LoadDataSet. Прокрутив содержимое окна до определения данной процедуры, вы узнаете, что она вызы ва ет процедуру FtilDataSet, которая в свою очередь вызывает метод Fill двух объектов OieDhDataAdapter (рис. 2-16).

Часть I Основы работы с Microsoft ADO.NET j"-*F"0лtлfiл ;

i)ataforml 9 pubi sufc FiUI>aiiiSet(BYVai da^aSet Ля Chapters.cuat tdti ThrOT FlnnllJ He. oie№i:o Cionl. Closed End Tcy End 3ub ?эо ots chs Х -INS Рис. 2-16. Код, сгенерированный мастером для заполнения объекта DataSet При вызове метода Fill объекта QleDbDataAdapter выполняется запрос, задан ный свойству SelectCommand объекта DataAdapter, и его результаты заносятся в указанные объекты DataSet или DataTable. Мастер Data Form Wizard создает объекты DataAdapter для выборки содержимого нужных вам таблиц. Свойство SelectCommand любого объекта DataAdapter содержит запрос в следующем формате:

SELECT Fieldl. Field2, FieldN FROM HyTable Большинство кнопок формы описывают сами себя Ч так, при щелчке кнопки Add добавляется новая запись, а при щелчке кнопки Delete удаляется текущая за пись о клиенте. Кнопки со стрелками позволяют перемещаться по записям.

Реализация каскадных изменений с помощью объекта Dafafle/at/on Щелкните кнопку со стрелкой вправо, чтобы перейти к следующему клиенту. В текстовых полях связанной с данными формы отобразится информация о нем.

Из-за созданного вами объекта DataRelation (отношение между таблицами) в сет-> кс видны только заказы, размещенные данным конкретным клиентом. Кроме того, это отношение позволяет реализовать на форме и некоторые другие функции.

С помощью кнопок перемещения перейдите к первому клиенту', разместивше му заказы. Если вы не изменяли содержимое таблиц БД Northwind, то для клиента с идентификатором (CustomerlD} ALFKI указано несколько заказов. В текстовом поле CustomerlD наберите Chap2. He волнуйтесь: это не повлияет на содержимое БД. Затем перейдите к следующей записи и снова вернитесь к измененной вами записи. Просмотрите содержимое сетки: значение поля CustomerlD для всех зака зов Ч Chap2. Созданный вами объект DataRelation указал объекту DataSet каскад но изменять значения поля CustomerlD записи о клиенте на связанные записи о ГЛАВА 2 Создание ADO.NET-лриложений с помощью мастера DataForm Wizard заказах. Если удалить текущую запись о клиенте, объект DataSet также удалит все связанные с ней записи о заказах.

Передача изменений в базу данных Как уже упоминалось, изменения данных объекта DataSet не влияют на содержи мое БД. Чтобы убедиться в этом, закройте форму и повторно запустите проект.

Загрузите данные и с помощью кнопок перемещения перейдите к ранее изменяв шейся вами записи о клиенте. Вы увидите, что значение поля CustomerlD Ч гю прежнему ALFKI. Как упоминалось в главе 1, данные объекта DataSet отсоединены от БД. В ADO.NET имеются функции для передачи изменений в БД, но как ими воспользоваться? Для передачи изменений в БД применяют дополнительную фун кцию класса DataActatper ADO.NET. Подробнее об этом Ч далее.

Теперь снова измените запись о клиенте. Перейдите к первому клиенту, щелк нув кнопку с двойной стрелкой влево. Добавьте в конец названия компании букву X. Щелкните кнопку со стрелкой вправо, чтобы перейти к следующей записи, а затем Ч кнопку со стрелкой влево, чтобы вернуться к измененной записи. Вы увидите, что изменение по-прежнему хранится в объекте DataSet. Если закрыть форму и перезапустить проект, изменение будет утеряно.

Чтобы передать изменение в БД, щелкните кнопку Update. Курсор мыши изме нится со стрелки на часы, показывая, что форма выполняет код, передающий сде ланное вами изменение в БД. Когда курсор примет вид стрелки, закройте форму и перезапустите проект. Щелкнув кнопку Load, вы увидите новое название компании.

roaili t'ltiлin.isfc.МП jdesign] Oet*fomi1.vb '!,ХХХ DatffanM.vb I Рис. 2-17. Процедура UpdateDataSet, сгенерированная мастером Data Form Wizard Какой же код выполняет кнопка Update для передачи изменения в БД? Чтобы просмотреть его, закройте форму и вернитесь в среду Visual Studio.NET. Дважды Основы работы с Microsoft ADO.NET Часть I щелкните кнопку Update и просмотрите код события Click. Сгенерированный мастером код создает две процедуры для обновления БД Ч UpdateDataSet и LJpdate DataSource. Событие Click кнопки Update вызывает процедуру UpdateDataSet, ко торая в свою очередь вызывает процедуру UpdateDataSource. Определения этих процедур показаны на рис. 2-17 и 2-18.

Код процедур только на первый взгляд кажется сложным, однако на самом деле он прост. Сейчас мы вернемся к основному процессу, и рассмотрим код лишь поверхностно. Подробнее о передаче обновлений в БД Ч в главах 10 и 11 этой книги. Помните: мастер сгенерировал этот код для обработки любых изменений данных формы. Код обрабатывает изменение, добавление и удаление записей в обеих таблицах. Для управления обновлением данных используются методы Get Changes, Update и Merge, Рис. 2-18. Процедура UpdateDataSource, сгенерированная мастером Data Form Wizard Вызываем метод Update объекта DataAdapter Вместо того чтобы обсуждать эти методы по порядку их появления в коде, прежде я расскажу о методе Update Ч наиболее важном элементе процесса обновления, Как говорилось в главе 1, объект DataAdapter Ч это мост между объектом DataSet и БД, Метод Update объекта DataAdapter передает изменения из объекта DataSet в базу данных. Каждый объект DataAdapter соответствует одному объекту DataTable из состава нашего объекта DataSet. Чтобы передать изменения из обоих объек тов DataTable, следует вызвать метод Update обоих объектов DataAdapter.

При вызове метода Update объекта DataAdapter необходимо указать, какие дан ные нужно передать в БД Объект DataAdapter очень гибок, и его метод Update может принимать множество различных структур. Код, сгенерированный мастером Data ГЛАВА 2 Создание ADO.NET-приложений с помощью мастера DalaForm Wizard Form Wizard, использует объект DataSet, однако методу Update можно также пе редать объект DataTable или массив объектов DataRow, Объект DataAdapter просматривает содержимое структуры данных и опреде ляет, какие записи он способен обработать. Например, DataAdapter, созданный мастером Data Form Wizard на основе таблицы Customers, будет просматривать только соответствующий этой таблице объект DataTable. Объект DataAdatper вы бирает нужную таблицу для просмотра, используя набор TableMappings, о кото ром вкратце я рассказал в главе 1.

Обнаружив измененную запись, DataAdapter определяет тип изменения Ч вста вка, обновление или удаление Ч и передает его в БД, основываясь на его типе. Если запись изменена, объект DataAdapter выполняет объект Command, заданный свойству UpdateCommand. Точно так же DataAdapter использует свойство InsertCommand для передачи новых и свойство DeleteCommand Ч для удаления имеющихся записей.

Изоляция измененных записей Код функции UpdateRowSource формы вызывает метод GetCbanges объекта DataSet, Этот метод генерирует новый объект DataSet с именем objDataSetChanges, содер жащий только измененные записи. Метод GetCbanges принимает необязательный параметр, позволяющий указать, нужны ли вам все изменения или только какой то конкретный их тип Ч вставка, обновление или удаление.

На самом деле мастеру Data Form Wizard не требовалось создавать с помощью метода GetCbanges новый объект DataSet, содержащий только измененные запи си. Если объект DataSet, переданный в качестве параметра при вызове метода Update объекта DataAdapter содержит: неизмененные записи, те игнорируются. Так зачем же нужен метод GetCbanges?

Мастер Data Form Wizard генерирует двухуровневые приложения. Клиентское приложение взаимодействует непосредственно с БД. При создании многоуровне вого приложения, использующего Web-сервисы или компоненты СОМ+ и выпол няющегося на сервере промежуточного уровня, следует ограничить объем дан ных, передаваемых между компьютерами. Чем меньше данных передается, тем быстрее выполняется приложение.

Если в таком многоуровневом приложении у клиента есть объект DataSel с неизмененными записями для передачи в БД, клиент передает данные на проме жуточный уровень. Передавать на этот же уровень неизмененные записи не тре буется. Таким образом, умелое использование метода GetCbanges позволяет зна чительно повысить производительность многоуровневых ADO.NET-приложений.

Мастер Data Form Wizard создает двухуровневые приложения, однако генери руемый им код годится и для многоуровневых.

Реинтеграция изменений Просмотрев измененную запись и успешно передав ожидающее изменение в БД.

объект DataSet помечает эту запись как не содержащую ожидающих изменений.

Таким образом, исключается многократная передача одного и того же изменения при повторных вызовах метода Update.

Часть I Основы работы с Microsoft ADO.NET Ранее я рассказал о методе GetCbanges класса DataSet. Код формы использует объект DataSet, возвращенный методом GetCbanges, при вызове метода Update объекта DataAclapter.

После внесения обновлений объект DataSet помечает соответствующие запи си объекта objDataSetChanges как успешно обновившие БД. Тем не менее объект objDataSetChanges стоит отдельно от основного объекта DataSet формы. Нам нужно как-то объединить изменения, сделанные объектами DataAdapter в объекте objData SetChanges, и внести их в основной объект DataSet.

У класса DataSet имеется метод Merge, позволяющий объединять данные из двух объектов DataSet. Если записи объектов DataSet различаются, ADO.NET просто помещает все записи в тот объект, метод Merge которого вы вызвали. В нашем случае записи объекта objDataSetChanges ссылаются на те же данные, что и основной объект DataSet. Нам нужно, чтобы соответствующие записи основного объекта DataSet были перезаписаны записями объекта objDataSetChanges. ADO.NET срав нивает значения основного ключа, хранящиеся в записях, и определяет, какие же записи ссылаются на один и тот же ряд данных. По умолчанию ADO.NET переза писывает ряд того объекта DataSet, метод Merge которого вы вызвали, Таким об разом, изменения, вносимые объектами DataAdapter в объекты dsDelta DataSet, передаются основному объекту DataSet, и мы можем успешно обрабатывать пос ледующие обновления.

Панель компонентов Прежде чем продолжить, хочу обратить ваше внимание на еще одну особенность среды Visual Studio.NET. Разработчики, работавшие с предыдущими версиями Visual Studio, возможно, удивятся, увидев новую версию конструктора связанных с дан ными форм. Один из первых вопросов тех, кто работает на Visual Basic 6. Что это за панель под формой?* На рис. 2-19 под формой находится панель компонентов. Visual Studio.NET позволяет перетаскивать элементы из панели инструментов в конструкторы. Мно гие разработчики используют панель инструментов для добавления кнопок на фор мы. Тем не менее не все добавляемые компоненты видны в период выполнения.

Например, в Visual Basic 6 на форму можно добавить элементы управления Хтаймер* и диалоговое окно*, которые в период выполнения не видны Это ком поненты, свойства которых разрешено задавать в период разработки средствами окна Properties, но которым не соответствует какой-либо видимый элемент пользо вательского интерфейса. В Visual Basic 6 при добавлении такого элемента управ-, ления на форме появляется значок, однако в период выполнения данный элемент управления не виден.

Visual Studio.NET помещает не отображаемые компоненты в панель, располо женную под формой. Чтобы изменить свойства компонента в окне Properties, щелкните в панели нужный компонент. В панели компонентов нужной формы отображаются значки, соответствующие объектам DataConnection, DataAdapter и DataSet.

Компоненты со вкладки Data панели инструментов можно перетаскивать на форму или в панель компонентов. Некоторые компоненты, например DataAdapter, связаны с мастерами настройки. После того как вы перетащите на форму объект ГЛАВА 2 Создание ADO.NET-приложений с помощью мастера DataForm Wizard OleDbDataAdapter, запустится мастер настройки параметров объекта DataAdapler, используемого для взаимодействия с БД. Мастер генерирует код, основываясь на вводимых вами данных, аналогично мастеру Data Form Wizard. Объектные пере менные из панели компонентов инициализируются в скрытой области кода формы.

Откройте раздел кода, помеченный как Windows Form Designer generated code (рис. 2-20). Здесь находится весь сгенерированный конструктором код. Прокру тив содержимое окна за объявления объектов, вы увидите процедуру InitializeCom ponent, которая содержит код, сгенерированный мастером DataAdapter Configuration Wizard. Создание компонентов с использованием этих функций быстрой разра ботки приложений сэкономит вам уйму времени.

Панель комонентов Рис. 2-19. Панель компонентов среды Visual Studio.NET OMWo.ml.rt I Gill Oil Рис. 2-20. Раздел со скрытым кодом, сгенерированным мастером Основы работы с Microsoft ADO.NET 38 Часть I Мастер Data Form Wizard Ч отправная точка создания приложений для работы с БД Поздравляю! Вы только что создали работающее приложение для взаимодействия с базой данных.

Конечно, если бы этим его создание и ограничивалось, эта глава книги стала бы последней. Рассматриваемое здесь приложение максимально упрощено, Его не рекомендуется развертывать в сети с большим числом пользователей. Представь те: каждый пользователь выбирает каждую запись и каждый столбец из вашей БД.

Упс! Сетевой трафик выйдет из берегов.

Мастер Data Form Wizard можно считать, скорее, отправной точкой разработ ки, он не рассчитан на создание законченных решений. Однако работа с ним Ч хороший способ знакомства с ADO.NET, поскольку в результате вы сможете про сматривать генерируемый код.

Прежде чем перейти к следующей главе и подробно рассмотреть объект DataSet, вернемся на несколько минут к коду, сгенерированному мастером Data Form Wizard для нашего приложения. Не пытайтесь прямо сейчас понять, что делает та или иная строка кода Ч просто оцените его объем.

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

Вопросы, которые стоит задавать почаще Вы только что создали простое приложение, использующее ADO.NET, и познако мились с некоторыми возможностями данной технологии. Я показал принципы работы ADO.NET на примере фрагментов кода, сгенерированного мастером Data Form Wizard. Эта глава Ч не только отправная точка, но и своего рода анонс. Итак, вместо того чтобы, как обычно, привести возможные вопросы и ответы на них, я подкину несколько вопросов, над которыми вам придется подумать самостоятельно.

Часть ответов вы найдете в коде, сгенерированном мастером Data Form Wizard, другие Ч в следующих главах книги.

Вопрос. Поработав с формой, созданной мастером Data Form Wizard, я обнару жил, что могу добавлять новые заказы. Причем еще до добавления в БД поле OrderlD записи о новом заказе уже содержит конкретный номер. Как объект DataSet гене рирует его?

Вопрос. Что произойдет, если другой пользователь изменит содержимое запи си в период времени после того, как я получу эту запись, но до того, как я пере дам сделанные мной изменения в БД?

Вопрос. После того как я удалил запись о клиенте и щелкнул кнопку Update, при ложение выдало сообщение о том. что оператор DELETE конфликтует с ограни чением COLUMN REFERENCE. Что это значит? Как мне изменить код для коррект ной обработки такой ситуации?

ЧАСТЬ ПОДКЛЮЧАЕМСЯ:

ИСПОЛЬЗОВАНИЕ ПОСТАВЩИКА ДАННЫХ.NET ГЛАВА Подключение к базе данных \_/дин из этапов разработки приложения для взаимодействия с БД Ч установка соединения с источником данных и управление этим соединением. В объектной модели ADO.NET соединение с источником данных представлено объектом Con nection, Эта глава Ч справочник основных функций объекта Connection ADO.NET. Я расскажу, как создавать и использовать объекты Connection в коде и в среде раз работки Visual Studio.NET.

Основное внимание уделено объекту OleDbConnection Ч из двух входящих в Microsoft.NET Framework объектов Connection он используется наиболее часто. Если не оговорено иное, функции объекта стандартны и имеются у всех объектов Connection, независимо от их поставщика данных.NET, В фрагментах кода вам следует с помощью соответствующих конструкций ссылаться на пространства имен SystemData, SystemData.OleDb и SystemDataSqlClient, а в начало модулей кода (на Visual Basic.NET и Visual С*.NET соответственно) включить приведенные ниже строки. Подробнее о них Ч в документации по вы бранному вами языку программирования.

Итак, в код на Visual Basic.NET добавьте следующие строки:

Imports System.Data Imports System.Data.OleDb Imports System.Data.SqlCHent В код на Visual С*.NET добавьте:

using System.Data;

using System.Data.OleDb;

using System.Data.SqlClient;

ГЛАВА 3 Подключение к базе данных Использование объектов Connection Свойства объекта Connection позволяют задать реквизиты пользователя, а также указать расположение источника данных. Методы этого объекта позволяют управ лять соединением с источником данных. Кроме того, объект Connection можно использовать в качестве отправной точки для создания объектов Command и Transaction. Теперь немного о том, как создавать и использовать подключения в приложениях при помощи объекта Connection.

SQL Server Ч в массы!

Набор инструментальные средств разработчика (software development kit.

SDK) Microsoft.NET Framework включает файлы для установки Microsoft " Desktop Engine 2000 (MSDE).

Как и БД Access, MSDE Ч не требующий дополнительных лицензий, пред назначенный для распространения пакет для работы с БД Тем не менее, в отличие от БД Access и ядра БД Jet, MSDE Ч настоящая клиент-серверная СУБД, почти как SQL Server. В БД MSDE можно создавать таблицы, представ ления и хранимые процедуры, которые также будут выполняться в БД SQL Server. Кроме того, как и SQL Server, MSDE поддерживает стандартную и интегрированную проверку подлинности. MSDE основана на том же коде, что и SQL Server, и предоставляет многие его функции, В результате прило жения, взаимодействующие с БД MSDE, можно с минимальными усилиями преобразовать для работы с SQL Server.

Между MSDE и SQL Server имеется несколько важных отличий, о кото рых следует помнить. В MSDE нет некоторых серверных* функций SQL Server. Например, ядро MSDE рассчитано на обработку пяти параллельных подключений. При большем числе подключений производительность па дает. SQL Server поддерживает гораздо большее число параллельно работа ющих пользователей. Помимо этого размер БД MSDE ограничен двумя ги габайтами, а в SQL Server можно создавать БД большего размера, Также в MSDE нет средств разработки, поставляемых с SQL Server, например Enterprise Manager, Query Analyzer и SQL Profiler.

Подробнее о различиях SQL Server и MSDE Ч на Web-узлах MSDN и SQL Server.

MSDE 2000 работает на операционных системах семейства Windows 9x (Windows.98 и более старших), а также на всех версиях Windows NT 4.0/2000 ДР.

Используемые в книге строки подключения и запроса взаимодействуют с локальным экземпляром MSDE, поставляемым с.NET Framework SDK. Это позволяет копировать код из электронной версии книги и выполнять его, не изменяя строку подключения к БД.

Для устаноаки MSDE раскройте меню Start, выберите группу программ Microsoft.NET Framework SDK и затем Ч Samples And QuickStart Tutorials, В браузере откроется страница SDK's QuickStarts, Tutorials, And Samples. Если вы еще не устанавливали с этой страницы MSDE, появится окно, аналогич ное приведенному на рис. 3-1 см. след. стр.

3- Часть II Подключаемся: использование поставщика данных.NET Microsoft.NET Framework SDK Quicks tarts, Tutorials and Samples Nate: The.NET Framework Samples Database seUp program msy requn return ha this page ID complete the Quickstert tutorials installation.

Step 2: EUJILUlB-3u!kSta!S Because the QuititStar-s demonstrate a wide Рис, 3-1. Установка MSDE с помощью Microsoft.NET Framework SDK Щелкнув ссылку Install The.NET Framework Samples Database, вы устано вите на свой компьютер MSDE, При щелчке ссылки Set Up The QuickStarts устанавливаются примеры БД (стандартные БД pubs и Northwind из соста ва SQL Server, и БД, используемые примерами кода.NET Framework), а так же настраиваются виртуальные каталоги Internet Information Services (IIS) и Web-страниц QuickStart Tutorial.

Следующий фрагмент кода подключается к экземпляру MSDE из соста ва,NET Framework, используя библиотеку SQL DMO. Для выполнения кода йам потребуется добавить ссылку на эту библиотеку. SQL DMO Ч это СОМ-, а не, МЕТ-библиотека, поэтому при добавлении ссылки не забудьте перей ти на вкладку СОМ диалогового окна Add References.

Код выполняет содержимое файла сценария, а также просматривает ин формацию о полъзоБатедях и структуре ваших БД. Подробнее об использо вании объектной библиотеки SQL DMO Ч в справочном файле (SQLDMO.chm).

Visual Basic.NET Dim dffloServer As New SQLBKO.SQLServerO daioServer.toginSecure * True dfflOServer.Conneat("(local)\№etSDK") Dim filScrlScript As IQ.StreamReader Dim strPathToFile As String Console.WriteLlneC'InstaHing the sample Northwind database") strPathToFile л 'ХG:\VS.NET\FrameworkSDK\SafHples\Setup\iFistnwnd.sql" lO.File.DpenText(strPathtoPiie) ГЛАВА 3 Подключение к базе данных dmoServer. ExecutelmfnedlateCfllSqlSerlpt. ReadTofnd) filSqlScript.CloseO Console.WriteLineC"Instailing the sample pubs database") strPathToFiie = "C:\VS. NeAFrameworkSDX\Saffiples\Setup\instpu&s.sql" filSqlScript л IQ.File.OpenText(strPathToFile) dmoServer. Executelmmediate(filSqlSeript.ReatfToEnd) filSqlScript.CloseO Din dmoDatabase As SQLDMO.Database Dim dmoTable As SQLDMO.Table Console.WriteLineC"Databases:"} For Each dmoDatabase In dmoServer,Databases If Not draoDatabase.SystemObject Then Console.WriteLineCvbTab & draoDatabase.Name) For Each dmoTable In dmoDatabase.Tables If Not dmoTable.SystemObject Then Console.WriteLinefvbTab & vbtab & *noTable,Nae} Eftd If Next dmoTable Console.WriteLineC) End If Next efmoDatabase Dim draoLogin As SQLDMO.Login Console.WriteLineC"Logins:") For Each dmoLogin In dmoServer.Logins Console.WriteLineC vbTab & dstoLogin.Hame) Next dmoLogin Console.WriteLineC) dmoServer.DisConnect{) Visual C#.NET SQLDMO,SQLServer dioServer = new SQLDHO.SQLServeK);

dmoServer.LoginSecure = true;

dmoServer.Connect("Clocal)\\NetSDK", null, null);

System.10.Streamfieader filSqlScript;

string strPathToFile;

Console. WriteLinef "Installing the saieple Norttiwlnd database");

StrPathToFile - "C:\\VS,HET\\FrameworkSDK\\Samples\\Setup\\itistnwnd.sql' filSqlScript = System,10.File.OpenText{StrPathToFile);

dfltoServer, Executelmmediateff ilSqlScrlpt. FteadToEndO, SOLOMO.SQLDMOLEXEC_TVPE.SQLDMOExec_Default, null);

filSqlScript.CloseO;

см. след, стр, 44 Часть II Подключаемся: использование поставщика данных.NET Console, WriteLine( "Installing the sample pubs database");

strPathToFile = "CiXXVS.NrrXXFramew filSqlScrlpt = System. 10. File. GpenText(strPathTaFile);

dmaSe rve г. Executelmiaediate ( f USqlSc rl pt. ReadToEnd ( ), SQLDMO.SQLDMQ_EXEC,TYPE.SQLDMOExec_Q6fault, null);

filSsilScript.eiQseO;

Console. WrlteLineC "databases:");

foreach (SQLDHO. Database dmoDatabase in drac-Server. Databases) if (IdmoDatabase.SystemObject) I Console. WrlteLine("\t" + dmoDatabase.Name);

foreach (SQLDHO. Table dmoTable in dmoDatabase. Tables) If CldnioTable.SystemObject) Console, WriteLine("\t\t" + insole, Writeline( ) ;

Console. WriteLine( "Logins: " };

foreach (SQLDHO. Login dmoLogln in dmoServer, Logins) Cor*sole.WriteLine("\t" + dmologin. Наяда);

Console. WriteLineO;

duoServe r, DisCoRfvect( ) ;

Создание объектов Connection Для создания соединения с помощью объекта OleDbConnection в период выпол нения имеются два способа. Можно просто создать новый инициализированный объект OleDbConnection, как показано ниже:

Visual Basic.NET Dim en As OleDbConnection en = New 01eDbConnection() Visual C#.NET OleDbConnection en;

en = new OleDbConnectionO;

Или же инициализировать объект OleDbConnection с помощью конструктора класса.

Конструкторы Microsoft.NET Framework поддерживает конструкторы, которые при обычном программировании с использованием объектной модели COM (Component Object Model) недоступны. Конструктор можно рассматривать как метод класса, вызы ваемый при инициализации объекта. Обычно конструктор принимает парамет Подключение к базе данных ГЛАВА ры, соответствующие наиболее часто используемым свойствам класса. Например, класс OleDbConnection определяет конструктор, который принимает значение свойства ConnectionString создаваемого им объекта OleDbConnection.

Следующие фрагменты кода аналогичны друг другу. Для каждого языка про граммирования приводится по два фрагмента, первый из которых создает экзем пляр объекта OleDbConnection и инициализирует его, а второй Ч инициализиру ет объект OleDbConnection в период его создания, передавая параметр конструк тору этого объекта.

Visual Basic.NET Dim strConn As String strConn = "Provider=SQLOLEDB;

Data Source=(local)\NetSDK;

" i "Initial Catalog=Northwind;

Trusted_Connection=Yes;

" Dim en As OleDbConnection en = New OleDbConnection() en.ConnectionString = strConn Ч или Dim strConn As String strConn = "Provider=SQLOLEDB;

Data Source=(local)\NetSDK;

" A "Initial Catalog=Northwind;

Trusted_Connection=Yes;

" Dim en As OleDbConnection en = New OleDbConnection(strConn) Visual C#.NET string strConn;

strConn = "Provider=SQLOLEDB;

Data Source=(local)\\NetSDK;

" + "Initial Catalog=Northwind;

Trusted_Connection=Yes;

";

OleDbConnection en;

en = new OleDbConnectionO;

on.ConnectionString = strConn;

Ч или Ч string strConn;

strConn = "Provider=SQLOLEDB;

Data Source=(local)\\NetSDK;

" + "Initial Catalog=Northwind;

Trusted_Connection=Yes;

";

OleDbConnection en;

en = new OleDbConnection(strConn);

Visual Basic.NET и С* позволяют инициализировать переменные при их объяв лении. При совместном использовании с конструктором такая возможность по зволяет упростить приведенные выше фрагменты кода, а также объявлять, созда вать экземпляры и инициализировать объекты одной строкой:

Visual Basic.NET Dim strConn As String = "Provider=SQLOLEDB;

Data Source=(local)\NetSDK;

" & _ "Initial Catalog=Northwind;

Trusted_Connection=Yes;

" Dim en As New OleDbConnection(strConn) Подключаемся: использование поставщика данных.NET 46 Часть II Visual C#.NET string strConn = "Provider=SQLOLEDB;

Data Source=(local)\\NetSDK;

" + "Initial Catalog=Northwind;

Trusted_Connection=Yes;

";

OleDbConnection en = new OleDbConnection(strConn);

Строки подключения В приведенных выше фрагментах кода для объектов OleDbConnection передается строка подключения, которая состоит из пар параметр Ч значение*, разделен ных точкой с запятой:

strConn = "Параметр1=3начение1;

Параметр2=3начение2;

..."

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

Поставщик данных OLE DB.NET очень удобен для подключения к БД и предо ставляет множество способов создания строки подключения. Давайте вкратце рассмотрим создание строк подключения для трех наиболее часто используемых поставщиков данных OLE DB: для БД Access, БД SQL Server и БД Oracle.

Поставщик OLE DB для БД SQL Server При подключении к БД SQL Server можно указать собственного поставщика OLE DB, расположение экземпляра SQL Server, нужную БД, а также имя пользователя и пароль:

Provider=SQLOLEDB;

Data 5оигсе=Сервер;

Initial Catalog=BA;

User Ю=ИдентификаторПользователя;

Раз5иогй=Пароль;

Начиная с SQL Sewer версии 2000, на одном компьютере можно устанавливать несколько экземпляров SQL Server. Чтобы указать в коде нужный экземпляр, вос пользуйтесь следующим синтаксисом атрибута Data Source-.

Provider=SQLOLEDB;

Data Зоигсе=Сервер\Экземпляр;

Initial Catalog=Efl;

User Ю=ИдентификаторПопьзователя;

Password=napont.;

Если вы подключаетесь к SQL Server при помощи реквизитов для входа в сеть, можно воспользоваться атрибутом Integrated Security и опустить имя пользовате ля и пароль:

Provider=SQLOLEDB;

Data 8оигсе=Сервер;

Initial Catalog=Bfl;

Integrated Security=SSPI;

Pages:     | 1 | 2 | 3 | 4 | 5 |   ...   | 11 |    Книги, научные публикации