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

David Sceppa Microsoft Press Дэвид Москва 2003 Р Г Г If Р F г V А Л А - л г УДК 004.45 32.973.26-018.2 С28 Д.

С28 Microsoft с англ. Ч М.: дом Ч 640 стр.: ил.

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

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

УДК 004. ББК к по с Microsoft Corporation, тон, США.

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

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

й Оригинальное издание на английском язы ке, Microsoft й Перевод на русский язык, Microsoft Corporation, й Оформление и подготовка к изданию, изда (англ.) Русская Редакция, ISBN 5-7502-0223-2 Оглавление Благодарности Введение XXII Кому предназначена эта книга XXII Структура книги XXII Примеры и прочие забавные штуки XXIII Системные требования Техническая поддержка XXIV ОСНОВЫ РАБОТЫ С MICROSOFT i Глава 1 Обзор ADO.NET Зачем нужна новая объектная модель Объектная модель ADO.NET Поставщики данных Зачем необходимы отдельные классы и библиотеки Повышенная производительность Замечательные возможности расширения Пролиферация Обсуждение поставщиков данных в этой книге Подсоединенные объекты Объект Объект Command Объекты Объект Transaction Объект Parameter Объект DataAdapter Отсоединенные объекты Объект Объект Объект Constraint Объект Объект DataSet Объект Объект View Метаданные Объекты DataSet со строгим контролем типов которые стоит задавать почаще 2 Создание с помощью мастера DataForm Wizard Все без ума от примеров Создание связанной с данными формы средствами мастера Data Form Выбор подключения Выбор таблиц БД Создание отношений в объекте DataSet Оглавление Выбор отображаемых столбцов Выбор стиля отображения новой связанной с данными формы Отображение данных в связанной форме Изучаем сгенерированный мастером код Реализация каскадных изменений с объекта DataRelation Передача изменений в базу данных Вызываем метод Update объекта Изоляция измененных записей Реинтеграция изменений Панель компонентов Мастер Data Form Wizard Ч отправная точка создания приложений для работы с БД Вопросы, которые стоит задавать почаще ПОДКЛЮЧАЕМСЯ: ИСПОЛЬЗОВАНИЕ ПОСТАВЩИКА ДАННЫХ Глава 3 Подключение к базе данных Использование объектов Connection Создание объектов Connection Конструкторы Строки подключения 4б Поставщик OLE DB для БД SQL Поставщик OLE DB для БД Oracle Поставщик OLE DB для БД Access Поставщик OLE DB для драйверов ODBC Создание строк подключения в коде при помощи окна Data Links Создание строк подключения вручную при помощи диалогового окна Data Links Использование в строке подключения Открытие и закрытие соединений Использование пула соединений Что такое пул соединений включить пул соединений Что делать, если не надо помещать соединения в пул Как узнать, действительно ли закрыто соединение или оно просто помещено в пул Разрыв соединений Создание других объектов с помощью объектов Connection Создание объектов Command транзакций Получение информации схемы БД Функции среды Visual Studio доступные в разработки Работа с объектами Connection в окне Server Explorer Добавление соединений в Server Explorer Поставщики данных OLE DB, ODBC и Сохранение пароля Интегрированная проверка подлинности Добавление соединений в приложение Оглавление VII Панель компонентов Использование нового Создание Connection с помощью панели инструментов Использование нового соединения в период выполнения Где же код? Особенности объекта объекта Свойство tring Свойство и Свойство Provider Свойство Свойство State Методы объекта Метод Метод Метод Close Метод CreateCommand Метод Метод Open Метод События объекта OleDbConnection Событие InfoMessage Событие StateChange которые стоит задавать почаще Глава 4 Выполнение запросов к базе данных Использование объектов Command в коде Создание объекта Command Выполнение не возвращающего записей Просмотр результатов запроса с помощью объекта DataReader Выборка результатов Ускоренная выборка Выборка нескольких наборов результатов пакетов командных запросов Закрытие объекта DataReader Выполнение запроса, возвращающего одно значение Выполнение параметризованного запроса Вызов хранимой процедуры Получение данных при помощи вывода Выполнение запроса в транзакции Создание объектов Command в Visual Studio Перетаскивание с панели инструментов Задание значения свойства Connection Использование Query Builder Использование нового объекта Command в коде Перетаскивание из Server Explorer Особенности объектов Command DataReader и Parameter Свойства объекта OleDbCommand Свойство Свойство Command Type Свойство Parameters Оглавление Свойство Transaction Свойство Методы объекта Метод Cancel Метод ExecuteReader Метод ExecuteScalar Метод Prepare Метод Свойства объекта OleDbDataReader Свойство Depth и метод Свойство IsClosed Свойство Свойство Методы объекта OleDbDataReader Метод Read Метод GetValue Методы Метод Метод NextResult Метод Close Методы и Метод GetSchemaTable Метод GetData и свойство Depth Создание объектов Parameter объекта Свойство Свойство Direction Свойство Value Свойства SourceColumn и Свойства и Type Свойства Precision, Scale и Size Вопросы, которые стоит задавать почаще Глава 5 Получение данных с помощью объектов Что собой объект DataAdapter Чем объект отличается от других основанных на запросах Объект DataAdapter предназначен для работы с отсоединенными данными Между объектами DataAdapter и DataSet нет прямой связи Объект DataAdapter содержит логику обновления для передачи в БД изменений, хранящихся в объекте DataSet Логикой обновления в объекте DataAdapter можно управлять Анатомия объекта Дочерние команды Набор TableMappings Создание и использование объектов DataAdapter Создание объекта DataAdapter Конструкторы DataAdapter Оглавление IX Получение результатов запроса Использование метода Создание объектов DataTable и при помощи метода перегруженных методов Fill Открытие и закрытие соединений Многократный вызов метода Сопоставление результатов объекту DataSet Набор объекта 14б Свойство Работа с запросами Получение результатов выполнения хранимых процедур Хранимые процедуры Oracle Выборка информации схемы Метод Создание объектов DataAdapter в Visual Studio Перетаскивание объекта DataAdapter с панели Использование мастера Adapter Configuration Wizard Перетаскивание из Server Предварительный просмотр результатов, объектом DataAdapter Просмотр кода, генерируемого мастером Особенности объекта DataAdapter Свойства объекта DataAdapter Свойства и DeleteCommand Свойство TableMappings Свойства MissingMappingAction и MissingSchemaAction Свойство Свойство ContinueUpdateOnError Методы объекта DataAdapter Метод Fill Метод Метод GetFillParameters 1б Метод Update 1б События объекта DataAdapter Событие FiltError События и Вопросы, которые стоит задавать почаще АВТОНОМНАЯ РАБОТА С ДАННЫМИ:

ОБЪЕКТ DATASET МОДЕЛИ ADO.NET Глава 6 Работа с объектами DataSet Возможности объекта DataSet Работа с отсоединенными данными Прокрутка, поиск и Работа с иерархически данными Кэширование изменений Интеграция с Универсальная функциональность Оглавление Использование объектов DataSet 17" Создание объекта DataSet Просмотр структуры, создаваемой при вызове метода DataAdapter.Fill Объект Объект DataColumn Просмотр возвращаемых объектом DataAdapter Объект Просмотр содержимого Просмотр объектов DataRow в объекте DataTable Проверка данных в объекте DataSet Свойства объекта используемые для проверки данных Набор Constraints объекта DataTable Получение информации схемы с помощью метода Создание объектов DataTable в коде Создание объекта DataTable Добавление объекта DataTable в набор Tables объекта DataSet Добавление столбцов в объект DataTable Указание типа данных объекта DataColumn Добавление первичного ключа Добавление других ограничений Использование столбцов с автоинкрементом Добавление столбца, основанного на выражении Создание объектов DataTable, соответствующих таблицам и Order Details Изменение содержимого объекта DataTable Добавление нового объекта DataRow Редактирование существующей записи Работа со значениями Null в объекте DataRow Удаление объекта DataRow Исключение объекта DataRow свойства DataRow.RowState Просмотр отложенных изменений объекта DataRow Работа с объектами DataSet в среде Visual Studio объекта DataSet на основе объектов DataAdapter Создание нового объекта DataSet с нуля Создание объекта DataSet без контроля типов Особенности объектов DataSet, DataTable, DataColumn, DataRow, и Свойства объекта DataSet Свойство Свойство DataSetName Свойство DesignMode Свойство Свойство Свойство HasErrors Свойство Locale Свойства Namespace и Prefix Свойство Relations Свойство Tables Оглавление XI Методы объекта DataSet Методы и RejectChanges Методы и Метод Clear Методы Clone и Сору Метод Методы GetXmJ и Метод HasChanges Метод Merge Методы и Методы и 2. Метод Reset События объекта DataSet Событие Свойства объекта DataTable Свойства и Свойство Columns Свойство Constraints Свойство DataSet Свойство Свойство Свойство ExtendedProperties Свойство HasErrors Locale Свойство Свойства Namespace и Prefix Свойство Свойство Rows Свойство Методы объекта DataTable Методы и RejectChanges Методы и Endlnit Методы и Метод Clear Методы Clone и Сору Метод Compute Метод GetChanges Метод GetErrors Методы и Метод Reset Метод Select События объекта DataTable : События ColumnChanged и ColumnChanging События и События и Свойства объекта Свойство и AutoIncrementStep Оглавление Caption Свойство Свойство ColumnName Свойство Свойство Свойство Expression Свойство ExtendedProperties Свойство Свойства Namespace и Prefix Свойство Ordinal Свойство Readonly Свойство Table Свойство Unique Свойства объекта Свойство HasErrors Свойство Свойство Свойство Свойство Table Методы объекта DataRow Методы и RejectChanges Методы BeginEdit, CancelEdit и EndEdit Метод ClearErrors Метод Delete Метод Методы и Метод Методы GetParentRow, и Метод Метод Свойства объекта Свойство Columns Свойство Свойство ExtendedProperties Свойство Свойство Table Свойства объекта Свойства DeleteRule и Columns и RelatedColumns Свойство ConstraintName Свойство ExtendedProperties Свойства RelatedTable и Table Вопросы, которые задавать почаще Глава 7 Работа с реляционными данными Особенности доступа к реляционным данным Соединяющие запросы Отдельные запросы объекты Recordset модели ADO Оглавление Объекты модели ADO.NET Работа с объектами в коде Создание объектов DataReiation Поиск связанных данных Метод объекта DataRow Метод объекта DataRow Метод объекта DataRow Выбор версии данных для просмотра 2( Проверка данных средствами объектов DataReiation Создание ограничений Использование имеющихся ограничений Смотри-ка! Нет ограничений! Объекты DataReiation, ссылающиеся на себя Отношения многие ко многим объектов DataReiation в объектах основанных на Каскадирование изменений Свойства и объекта Постепенный отказ от соединяющих Создание объектов DataReiation в Visual Studio Добавление объекта DataReiation в объект со строгим контролем типов Добавление объекта DataReiation в объект DataSet без контроля типов Особенности объекта Свойства объекта DataReiation Свойство Свойство Свойство Свойство DataSet Свойство ExtendedProperties Свойство Nested Свойство ParentColumns Свойство Свойство ParentTable Вопросы, которые стоит задавать почаще Глава 8 Сортировка, поиск, фильтрация Возможности поиска и фильтрации объекта DataTable Поиск записи по значениям первичного ключа Динамичный поиск Поиск по шаблону Использование символов-разделителей Использование дополнительных методов Select Указание порядка сортировки Указание нужного состояния искомых записей Что представляет собой объект View Объекты View данные из объектов DataTable Объекты View не являются SQL-запросами Использование объектов View в коде Создание объектов View Использование свойства XIV Использование объекта Просмотр всех записей доступных через объект Поиск данных в объекте Метод Find Метод объектов DataRowView Создание объектов DataView в Visual Studio Добавление нового объекта DataView в конструктор Задание значений свойств объекта DataView Особенности объекта DataView Свойства объекта DataView Свойства AllowDelete, и Свойство Свойства Count и Item Свойство Свойство Свойство Sort Свойство Table Методы DataView Методы AddNew и Delete Методы и И Методы Find и FindRows Метод Событие ListChanged объекта DataView Свойства объекта DataRowView Свойство Свойства IsEdit и Свойство Item Row Свойство Методы объекта DataRowView Методы BeginEdit, CancelEdit и Метод Метод Delete Вопросы, которые стоит задавать почаще Глава 9 Работа с объектами DataSet со строгим контролем типов Создание объектов DataSet со строгим контролем типов Сложный способ Использование метода объекта DataSet Использование утилиты XML Schema Definition Tool Простой способ Где же находится класса? Использование объектов DataSet со строгим контролем типов Добавление записи Поискзаписи Редактирование записи Оглавление XV Работа со значениями NULL Работа данными Прочие возможности DataTable и Когда стоит использовать объекты DataSet со строгим контролем типов Программные компоненты и швейцарские армейские ножи Преимущества периода разработки Преимущества периода выполнения Что еще следует учесть Осуществление структурных изменений Преобразование объектов DataSet Возможность генерирования данных без контроля типов Выбор способа разработки Вопросы, которые стоит задавать почаще Глава 10 Передача обновлений в базу данных Урок истории Преимущества передачи с использованием объектов Recordset ADO Недостатки передачи обновлений с использованием объектов ADO Передача обновлений с помощью объектов Command модели ADO.NET Передача обновлений с использованием ADO.NET Конфигурирование объектов DataAdapter вручную Связанные параметры Передача обновлений с использованием хранимых процедур собственной логики обновления Преимущества Недостатки Создание логики обновления с помощью объекта CommandBuilder Как объект CommandBuilder генерирует логику Преимущества и недостатки использования объекта CommandBuilder 37( Создание логики обновления средствами мастера Data Adapter Configuration Просмотр структуры объекта DataAdapter Параметры генерации логики Передача обновлений с помощью хранимых процедур Преимущества и недостатки использования мастера Прочие проблемы обновления Способы оптимистичного управления параллелизмом Использование только полей первичного ключа Использование всех полей в разделе WHERE Использование полей первичного ключа и полей типа timestamp Использование полей первичного ключа и измененных полей Работа со значениями NULL Передача обновлений в транзакциях Использование набора Лучший способ обновления Особенности объекта Свойства объекта OleDbCommandBuilder Свойство DataAdapter.' Свойства и Методы объекта OleDbCommandBuilder Оглавление Метод DeriveParameters Методы и Метод Вопросы, которые стоит почаще Глава Сложные случаи обновления данных Обновление отображаемого содержимого записи после передачи изменений Получение новых значений поля timestamp после передачи обновления данных при помощи запросов после передачи обновления Свойство объекта Command Выборка новых данных с помощью параметров вывода Выборка данных с помощью события объекта DataAdapter после передачи обновления Приложение Timestamp Выборка новых значений автоинкремента Работа с SQL Server Функция и ключевое слово Работа с Access 2000 Работа с последовательностями Oracle Генерирование фиктивных для последовательности Приложение, выбирающее значения автоинкремента ключевого слова Передача иерархичных изменений Передача записей, ожидающих вставки и удаления Передача иерархичных изменений с помощью метода Select объекта DacaTable Передача иерархичных изменений с помощью метода Работа со значениями автоинкремента и реляционными данными Изоляция и повторная интеграция изменений Экономное использование полосы пропускания при помощи метода GetChanges Метод Merge объекта DataSet Метод Merge и свойство Метод Merge и значения Изящная обработка неудачных попыток обновления Опережающее планирование Свойство объекта DataAdapter Информирование пользователя об ошибках Выборка текущего содержимого конфликтующих записей Если сначала не получилось Импорт новых значений с помощью метода Приложение Conflicts Работа с распределенными транзакциями Координаторы транзакций и диспетчеры ресурсов фиксация Распределенные транзакции в Framework Поддержка распределенных транзакций в БД Создание собственных компонентов Оглавление XVII Регистрация в транзакции Подтверждение или отмена результатов работы Упрощенная работа с распределенными транзакциями Приложение Прочие преимущества использования служб Services В сложных случаях обновления данных всегда используйте ADO.NET Вопросы, которые стоит задавать почаще Глава 12 Работа с Мост через пропасть и доступом к данным и считывание XML-данных Методы объекта DataSet для работы с XML-данными Метод GetXml Методы и Методы и Формирование схем Свойства ADO.NET. влияющие на схему XML-документа Имена элементов и Элементы или атрибуты: что выбрать? Вложенные реляционные данные Пространства имен и префиксы Кэширование изменений и XML-документы XML-документы формата diffgram DataSet + = Использование объекта XmlDataDocument Работа с объектом DataSet как с XML-документом Кэширование обновлений XML-документа Получение XML-данных из БД SQL Server Использование запросов XML Выполнение запроса SELECT...FOR XML в SQL Server Query Загрузка результатов запроса в объект DataSet Загрузка запроса объект XmlDocurnent Поставщик данных SQL XML Data Provider Загрузка данных в объект XmlDocurnent с помощью объекта Загрузка данных в объект DataSet с помощью объекта Использование шаблонов запросов Выполнение шаблонных запросов с объекта SqlXmlCommand Параметризованные шаблонные запросы Работа с запросами XPath Добавление информации схемы Передача обновлений Логика используемая объектом SqlXmlCommand Простой пример с использованием ADO.NET и XML Два пути к конечному пункту ADO.NET и счастливая пара Вопросы, которые стоит задавать почаще XVIII Оглавление СОЗДАНИЕ ЭФФЕКТИВНЫХ ПРИЛОЖЕНИЙ С ИСПОЛЬЗОВАНИЕМ Глава 13 Создание эффективных Windows-приложений Быстрое создание пользовательского интерфейса при помощи с данными Этап 1. Создание объектов и DataSet Этап 2. Добавление связанных с данными элементов Этап 3. Получение данных Этап 4- Добавление кнопок для перемещения по содержимому объекта DataSee Этап 5. Добавление кнопок Add и Delete Этап 6. Передача изменений в БД Этап 7. Добавление кнопок Edit. Update и Cancel Этап 8. Просмотр дочерних данных Получение только списка заказанных клиентом товаров Добавление объекта DataTable Order Details в класс DataSet со строгим контролем типов Добавление элемента управления DataGrid, отображающего дочерние данные Передача в БД изменений обеих таблиц Этап Связывание второй формы с тем же источником данных Этап 10. Совершенствование пользовательского интерфейса Добавление функции поиска с использованием элемента ComboBox Управление форматом связанных данных Этап Если хочешь сделать хорошо Резюме: связывание с данными Проблемы разработки приложений Выборка только необходимых данных Стратегии обновления Мгновенные и Повторная выборка перед разрешением изменений ADO.NET и пессимистическое управление блокировками Стратегии подключения Подсоединение и отсоединение Пул соединений Работа с данными больших двоичных объектов Отложенная выборка Обработка ВЮВ-данных с помощью объектов DataSet Обработка ВЮВ-данных с помощью объектов DataReader Двоичные в БД Пример приложения для работы с Пользовательские интерфейсы, созданные с применением тяжелой артиллерии ADO.NET которые стоит задавать почаще Глава Создание эффективных Web-приложений Краткий обзор Web-приложений Оглавление XIX Преимущества и недостатки способа без хранения сведений о состоянии молчаливый клиент Подключение к БД Использование доверенных соединений Подмена пользователей Работа с БД Access данных на Web-странице Использование метода Связывание управления TextBox с объектом DataSet 5 Связывание элемента управления TextBox с объектом DataReader Связывание элементов управления DataGrid с результатами запросов Связывание элемента управления DataGrid с объектом DataSet Связывание элемента управления DataGrid с объектом DataReader 5 Кэширование данных между обращениями к БД Способ без хранения сведений о состоянии Преимущества Недостатки Кэширование данных на стороне клиента Файлы cookie Скрытые поля Свойство Хранение сведений о состоянии на стороне Web-сервера Свойство Session Объект Application Объект Cache Кэширование вывода Хранение сведений о состоянии в БД Недостатки Рекомендации по хранению сведений о состоянии Хранение данных в объектах ViewState Хранение данных в объекте Application Хранение данных в объекте Session Хранение данных в БД Кэширование вывода Постраничная разбивка информации Средства постраничного предоставляемые Web-элементом управления DataGrid Свойство Свойства и Средства постраничного представления информации, методом объекта DataAdapter Создание запросов, возвращающих страницу данных Приложение Редактирование на Web-странице Упрощение редактирования данных при помощи элемента управления DataGrid Обработка событий, связанных с редактированием содержимого DataGrid Передача изменений в БД Внесение изменений в объект DataSet Создание собственных запросов UPDATE Приложение Вопросы, которые задавать почаще XX Оглавление ПРИЛОЖЕНИЯ Приложение А Прочие поставщики данных Поставщик данных SQL Client Data Provider Именованные параметры и маркеры параметров Подключение БД SQL Server с помощью объекта SqlConnection 5б запроса с помощью объекта Использование объектов и 5бЗ Методы и пространство имен Вызов хранимых процедур Получение информации схемы БД Поставщик данных ODBC Data Provider Подключение к БД при помощи объекта Использование параметризованных запросов Получение результатов запроса с объекта OdbcDataAdapter Просмотр запроса при помощи объекта OdbcDataReader Вызов хранимой процедуры Получение информации схемы БД Поставщик данных Oracle Client Data Provider Подключение БД при помощи объекта Использование параметризованных запросов Получение результатов запроса с помощью объекта Просмотр результатов запроса при помощи объекта OracleDataReader Специфичные для Oracle типы данных Вызов хранимой процедуры Выборка данных из Получение схемы БД Проблемы, общие для поставщиков данных Создание кода, независимого от поставщика Выбор подходящего типа данных поставщика Приложение Б Утилиты Утилита ADO.NET Ad Hoc Query Tool Подключение к БД Добавление поставщиков данных Выполнение запросов Просмотр информации схемы Передача обновлений Параметры приложения Утилита ADO.NET Builder логики обновления Элемент управления ADO.NET Navigation Control Добавление элемента управления ADO.NET Navigation Control на панель инструментов Visual Studio Конфигурирование свойств ADO.NET Navigation Control, обеспечивающих взаимодействие с данными Конфигурирование прочих свойств ADO.NET Navigation Control Предметный указатель Об авторе Благодарности всего, своих мать и отца за терпение и поддержку, оказан ную мне при работе как над этой книгой, так и вообще в жизни.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

XXIV Введение Х пакет инструментальных средств разработчика Framework SDK (доступен по адресу Х среда разработки Visual Studio (необязательна, но рекомендуется);

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

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

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

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

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

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

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

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

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

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

Разве ADO нужна не для того же? Зачем Microsoft создала новую технологию доступа к Похоже, что в каждой последующей версии Visual Basic реализуется новая модель доступа к данным. В Visual Basic появилась технология Data Access Objects В 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 дополнительные однако ADO никогда не будет обрабатывать XML данные так же как это делает ADO.NET. Это обусловлено тем, что ADO.NET создавалась с учетом, a ADO Ч без учета XML. Ядро ADO по зволяет передавать отсоединенные объекты между различными уровня ми приложения, но объединить содержимое нескольких таких объектов нельзя.

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

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

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

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

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

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

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

Для выборки данных из БД в объект DataSet последний передают Fill под соединенного объекта ADO.NET Аналогичным образом для Часть I Основы с Microsoft дачи из в БД объект нужно передать ме тоду Поставщики данных данных Ч это набор предназначенных для ствия с хранилищем данных определенного типа. Framework включает два поставщика Ч SQL Client Provider и DB Data Provider. Постав щик OLE DB Data Provider позволяет с различными хра данных посредством поставщика OLE DB. Поставщик SQL Client Data Provider рассчитан исключительно на взаимодействие с БД SQL Server вер сии 7 или более поздней.

Каждый поставщик данных реализует одинаковые базовые классы Ч Con nection, Command, Parameter и конкретное имя которых зависит от поставщика. Так, у поставщика SQL Client Data Provider есть объект а у поставщика OLE DB Data Provider Ч объект Независимо от типа поставщика, объект реализует одинаковые базо вые функции посредством одних и тех же базовых интерфейсов. Чтобы открыть соединение с хранилищем данных, создайте экземпляр объекта постав щика, задайте значение свойства и затем вызовите метод У каждого поставщика данных Ч собственное пространство имен. Оба поставщика из состава Framework относятся к пространству имен где находятся отсоединенные объекты. Поставщик OLE Data Provider находится в пространстве имен а поставщик SQL Client Data Provider Ч в пространстве имен Поставщики данных реализуют одинаковые базовые функции, и поэто му создаваемый вами код выглядит примерно одинаково зависимости от по ставщика. Как видно из следующих фрагментов кода, все, что требуется для пере хода от поставщика OLE DB Data Provider к поставщику SQL Client Data Provider, Ч заменить класс, экземпляр которого создается, и привести строку под ключения в соответствие требованиям Visual Basic и закрываем соединение использованием поставщика OLE DB Data Provider Dim As New = "Data и соединение использованием поставщика SQL Client Data Provider Dim As New SqlConnection = "Data & "Initial 1 Обзор ADO.NET Visual C# и закрываем соединение поставщика OLE Data Provider cnOleDb = new = "Data и соединение использованием поставщика SQL Client Data Provider = new = "Data "Initial Зачем необходимы отдельные классы и библиотеки В предыдущих технологиях доступа к данным Microsoft нет отдельных библио тек и классов для разных хранилищ данных. Многие разработчики спрашивают, почему Microsoft решилась на такое значительное изменение. Основных причин три: возможность расширения и пролиферация.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

SELECT Customers Можно также указать имя таблицы, представления или хранимой процедуры и средствами свойства задать тип выполняемого запроса. Объект Command выполнять запрос разными способами. Если запрос не воз вращает записи, вызовите метод Метод возвращает объект позволяющий просматривать возвращенные запросом запи си. У объекта третий метод выполнения, ко торый аналогичен методу но предназначен для работы с запроса ми, возвращающими результаты в формате Объекты DataReader Объект DataReader предназначен для максимально быстрой выборки и просмот ра возвращаемых запросом записей. Этот объект позволяет просматривать резуль таты запроса по одной записи за раз. При переходе к следующей записи содер жимое предыдущей записи отбрасывается. Объект DataReader не поддерживает обновление, и возвращаемые им данные доступны только для чтения. Поскольку DataReader реализует лишь ограниченный набор функций, он очень прост и имеет высокую производительность.

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

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

Объект Parameter Скажем, вам требуется выбрать из БД Orders все заказы конкретного Запрос выглядит SELECT Phone FROM Customers WHERE CustomerlD Значение поля CustomerlD в разделе WHERE запроса зависит от клиента, зака зы которого требуется просмотреть. Однако при использовании такого запроса его текст придется менять каждый раз, когда потребуется просмотреть заказы другого клиента.

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

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

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

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

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

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

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

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

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

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

Объект DataTable Объект ADO.NET аналогичен объектам Recordset ADO и DAO. Он позво ляет просматривать данные в виде наборов записей и столбцов. Чтобы поместить результаты запроса в объект применяют метод Visual Basic Dim As String = "SELECT Customers" Dim As = Dim daCustomers As New strConn) Dim As New Visual C# string strSQL = "SELECT CompanyName FROM Customers";

string strConn daCustomers new strConn);

DataTable tblCustomers = new DataTableO;

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

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

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

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

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

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

Basic Dim col As New DataColumnO With col =.DataType = = "UnitPrice * End With C# col = DataColumnO;

= "ItemTotal";

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

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

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

Visual Basic Dim row As DataRow row = Visual C# DataRow row;

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

Классический Visual Basic strConn As String, As String Dim rs As strConn = = "SELECT CustomerlD, FROM Set = New = strSQL, strConn, adLockReadOnly, adCmdText Do While Not ГЛАВА 1 Обзор ADO.NET Loop Для просмотра содержимого объекта ADO.NET следует перемещаться по объектам из набора Visual Basic Dim As Dim da As New Dim As New Dim As DataRow Each Next row Visual C# string strConn;

da = new strConn);

DataTable tbl = new DataTableO;

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

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

DataSet также предоставляет метод дополняющий метод Сервер промежуточного уровня, с помощью которого вы передаете измене ния в БД, может, используя методом объект 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-код.

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

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

Visual Basic Dim As DataSet Dim As DataRow ГЛАВА 1 Обзор создающий объект DataSet "Orders"), For Each In for In Next rowOrder rowCustomer C# DataSet и инициализируем объект DataSet (DataRow rowCustomer in customer foreach (DataRow rowOrder in + Кроме объекты предоставляют свойства, позволяющие обес печить ссылочную целостность. Например, DataRelation можно сконфигурировать чтобы изменение значения первичного ключа родительской записи тически каскадировалось дочерним записям. Объект кроме того, удается настроить таким образом, что при удалении записи родительском автоматически удаляются соответствующие записи дочернего объекта DataTable, Объект Выбрав результаты запроса в объект DataTable, можно посредством объекта View просматривать это содержимое разными способами. Если содержимое требуется упорядочить по определенному полю, задайте имя этого поля ству Sort объекта DataView. Кроме того, свойство Filter объекта DataView позволит вам выводить только удовлетворяющие заданным критериям.

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

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

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

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

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

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

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

Dim rs as Recordset прочие переменные переменные и открываем соединение с БД Do While Not Loop В данном случае программист знает, что запрос содержит столбец Смысл в том, что вы, как обычно имеете представление, какие стол бцы и с каким типом данных вернет ваш запрос. Тем не менее ADO заранее неиз вестно, как будут выглядеть результаты запроса. А ей приходится обращаться к OLE и вопросы типа столбцов в наборе ре зультатов Каковы типы данных этих дан ных? и Какие поля первичного ключа таблиц упомянуты в Поставщик может ответить на некоторые из этих вопросов, но в большинстве случаев ему приходится обращаться к БД.

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

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

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

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

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

Visual DataSet ds;

и заполняем объект DataSet Console.

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

Visual Basic Dim ds As и заполняем объект DataSet Visual C# CustomersDataSet ds;

и заполняем DataSet Console.

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

Visual Basic Dim ds as DataSet создающий объект DataSet DataTable под названием Customers Dim As = 20 Часть Основы работы с = = "Alfreds Visual C# DataSet ds;

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

г = = "ALFKI";

= "Alfreds Futterkiste";

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Types:

and Deployment Windows ASP MET Service project for creating an application a and created at Studio I I Рис. 2-1. Создание нового Windows-приложения ГЛАВА 2 Создание с помощью мастера Примечание При создании Web-формы используются более сложные концеп ции, о них пойдет речь в главе Здесь для простоты я предлагаю со здать связанную с данными Windows-форму.

Теперь возможностями мастера Data Form Wizard.

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

Item Windows Form Control XML XML Caned Рис. 2-2. Запуск мастера Data Form Wizard из диалогового окна Add New Item Откроется первое окно мастера (рис. 2-3).

Рис. 2-3. Начальное окно мастера Data Form Wizard Часть Основы работы с Microsoft Щелкните Next. В следующем диалоговом окно появится предложение исполь зовать имеющийся объект DataSet или создать новый. Поскольку объектов еще нет, создайте новый (рис. 2-4), want to use [he and Рис. Создание нового объекта DataSet для новой формы Имя объекта DataSet должно отражать тип его данных. В нашем примере DataSet содержит таблицы Customers и Orders БД так что вам задать имя Щелкните Next.

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

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

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

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

Чтобы выбрать нужный экземпляр на компьютере с несколькими экземпляра ми SQL Server, введите имя машины, обратную косую черту и имя экземпляра, например ГЛАВА 2 Создание с помощью мастера Wizard Wizard data connection Id Рис. Диалоговое окно Choose A Data Connection Рис. 2-6. Вкладка Connection окна OLE DB Data Link Properties По умолчанию пароль учетной записи администратора SQL ver пустой. В целом это не слишком удачная идея, и по соображени ям безопасности пароль рекомендуется изменить. Кроме при со приложений для работы с БД SQL Server не рекомендуется реги стрировать пользователей под учетной записью Создай те отдельные учетные записи пользователей или одну общую учетную запись и назначьте им соответствующие разрешения. Следует позаботить ся о чтобы пользователи случайно или намеренно не внесли в БД необратимые изменения.

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

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

SAM 1 1 OLE OB 4 0 OB Provider OLE И OLE DB lor oft OLE ODBC \ OLE OLE В Рис. 2-7. Вкладка Provider окна OLE DB Data Link Properties Если у вас нет доступа к БД SQL Server или а есть Ч лишь к Access-вер сии БД выберите поставщик Microsoft Jet 4.0 OLE DB.

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

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

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

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

tables or i Рис. Выбор таблиц в мастере Data Form Выберите таблицы Customers и Orders БД и щелкните Next.

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

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

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

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

a Рис. 2-10. Определение отношений между таблицами Выбор отображаемых столбцов В диалоговом окне Choose Tables And Columns To Display On The Form мастера Data Wizard (рис. можно выбрать столбцы, отображаемые на связанной с данными форме. Когда вы назначали таблицы для объекта у вас не было возможности указать нужные столбцы Ч мастер Data Form Wizard получил все записи и все столбцы выбранных Можно отобразить одну или две таблицы из отношения master/detail. После того как укажете нужные таблицы, появится перечень их столбцов. По умол чанию выбраны все столбцы;

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

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

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

ГЛАВА 2 Создание с помощью мастера Choose and to on fan display Ч Chan table the form, [he a do you la.

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

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

Choose style a a or.

do '" a da an the select to - or Рис. 2-12. Выбор стиля отображения содержимого таблицы 30 Часть I работы с Примечание В случае с Web-приложением мастер создает объекты которые преобразуют содержимое ваших таблиц в HTML-таблицы для отображения на форме.

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

а fesehiblylnfo.vl:

I I Рис. 2-13. Новая, связанная с данными форма Рис. 2-14. Диалоговое окно проекта ГЛАВА 2 с помощью мастера Wizard Собрав и запустив проект прямо сейчас, вы не новой связанной с дан ными формы. Если вы не изменяли параметров проекта, отобразится только форма, с самого начала в проекте. Чтобы изменить параметры для отображе ния новой выберите из меню Project среды Visual Studio команду или щелкните в окне Solution Explorer проект правой кнопкой и выбе рите Properties. Откроется диалоговое окно Property Pages. В раскрывающемся списке Startup укажите 1 (рис. 2-14). Щелкните ОК, чтобы сохра нить изменения, Отображение данных в связанной форме Чтобы запустить проект и увидеть новую связанную с данными форму, нажмите клавишу выберите из меню Debug команду Start или щелкните кнопку Start в панели инструментов, Вы увидите, что на форме имеются метки и текстовые поля для всех полей таблицы а также связанная с данными сетка для ото бражения содержимого таблицы Orders. Однако никаких данных нет. Все элементы управления Форма создала объект с таблицами и отношением, определенным средствами мастера Data Form Wizard, причем абсолютно пустой.

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

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

Часть I Основы работы с 9 Ля End End Х Рис. 2-16. Код, сгенерированный мастером для заполнения объекта При вызове метода Fill выполняется запрос, задан ный свойству объекта и его результаты заносятся в указанные объекты DataSet или Мастер Data Form Wizard создает объекты DataAdapter для выборки содержимого нужных вам таблиц. Свойство любого объекта содержит запрос в следующем формате:

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

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

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

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

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

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

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

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

I Рис. Процедура сгенерированная мастером Data Form Wizard Какой же код выполняет кнопка Update для передачи изменения в БД? Чтобы просмотреть его, закройте форму и вернитесь в среду Visual Studio Дважды Часть I Основы работы с щелкните кнопку Update и просмотрите код события Click. Сгенерированный мастером код создает две процедуры для обновления БД Ч и Событие Click кнопки Update вызывает процедуру торая в свою очередь вызывает Определения этих процедур показаны на рис. 2-17 и 2-18.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Откройте раздел кода, как Windows Form Designer generated code (рис. 2-20). Здесь находится весь сгенерированный конструктором код.

тив содержимое окна за объявления объектов, вы увидите которая содержит код, сгенерированный мастером DataAdapter Configuration Wizard. Создание компонентов с использованием этих функций быстрой разра ботки приложений сэкономит вам уйму времени.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Imports Imports Imports В код на Visual С* добавьте:

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

SQL Server Ч в массы!

Набор средств (software kit.

SDK) Microsoft Framework включает для Microsoft " Desktop 2000 (MSDE).

Как и БД Access, MSDE Ч не требующий дополнительных лицензий, пред назначенный для пакет для работы с БД Тем не менее, в отличие от БД Access и ядра БД Jet, MSDE Ч настоящая почти как SQL Server. В БД MSDE можно создавать таблицы, представ ления и хранимые процедуры, которые также будут выполняться в БД SQL Кроме того, как и 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.98 и более старших), а также на всех версиях Windows NT ДР.

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

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

см. след. стр.

3- Часть использование поставщика данных Microsoft Framework SDK Quicks tarts, Tutorials Samples Database ha complete the the a Рис, Установка с помощью Framework SDK Щелкнув ссылку Install The Framework Database, вы устано вите на свой компьютер MSDE, При щелчке ссылки Set Up The примеры БД (стандартные БД pubs и Northwind из соста ва Server, и БД, используемые примерами кода а так же настраиваются каталоги Internet Information Services (IIS) и Tutorial.

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

Код файла а также просматривает ин о и ваших БД. Подробнее об использо вании библиотеки SQL DMO Ч в Visual Basic As New As String sample Northwind ГЛАВА 3 Подключение к базе данных the pubs dmoServer.

filSqlScript.CloseO Din As dmoTable As Each In If Not Then & For Each In If Not Then & & If Next dmoTable End If Next As For Each In vbTab & Next dmoLogin Visual new = null);

filSqlScript;

string strPathToFile;

the StrPathToFile filSqlScript = см. стр, 44 Часть II поставщика данных the pubs = rve in Databases) if + in foreach in Создание объектов Connection Для создания соединения с помощью объекта в период выпол нения имеются два способа. Можно просто создать новый инициализированный объект OleDbConnection, как показано ниже:

Visual Basic As OleDbConnection = New Visual C# OleDbConnection = new Или же объект OleDbConnection с помощью конструктора класса.

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

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

Visual Basic Dim strConn As String = " "Initial Dim As OleDbConnection = New = strConn Ч или Dim strConn As String = A "Initial Dim As OleDbConnection = New Visual C# string strConn;

strConn + "Initial OleDbConnection = new = strConn;

Ч или Ч string strConn;

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

Visual Basic Dim strConn As String = & _ "Initial Dim As New 46 Часть II Подключаемся: использование поставщика данных Visual C# = + "Initial OleDbConnection = new Строки подключения В приведенных выше фрагментах кода для объектов OleDbConnection передается строка которая состоит из пар параметр Ч ных точкой с запятой:

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

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

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

Initial User Начиная с SQL версии на одном компьютере можно устанавливать несколько экземпляров SQL Server. Чтобы указать в коде нужный экземпляр, вос пользуйтесь следующим синтаксисом атрибута Data Initial User Если вы подключаетесь к SQL Server при помощи реквизитов для входа в сеть, можно воспользоваться атрибутом Security и опустить имя пользовате ля и пароль:

Integrated Security=SSPI;

От некоторых старых привычек трудно избавиться. При подключении к SQL Server посредством старой технологии (ODBC) сетевые реквизиты можно задей ствовать, воспользовавшись атрибутом Поставщик OLE DB SQL Server принимает этот атрибут как псевдоним Integrated Security. Я продолжаю использовать этот несколько устаревший синтаксис в основном потому, что зна чение Yes запомнить проще, чем Data Initial ГЛАВА 3 Подключение к базе данных Подробнее о параметрах данного поставщика Ч в документации Data Access SDK.

Поставщик OLE OB для БД Oracle Разработчики, использующие для подключения к БД Oracle, не просто устанавливают ADO.NET и создают строку подключения. И поставщик Microsoft OLE Provider for Oracle, и драйвер Microsoft ODBC Driver for Oracle взаимодей ствуют с клиентскими компонентами Oracle, а не непосредственно с БД Oracle.

Чтобы взаимодействовать с Oracle при помощи ADO.NET, вам потребуется уста новить соответствующую версию клиентских утилит Oracle и создать псевдоним БД. Затем можно воспользоваться строкой подключения:

Подробнее о параметрах данного поставщика Ч в документации Microsoft Data SDK.

Поставщик OLE DB для БД Для подключения к БД Access можно использовать соответствующий поставщик OLE DB Ч Microsoft Jet 4.0 OLE DB Provider. В строке подключения следует ука зать имя поставщика, его версию, а также расположение БД:

Если не указан полный ADO будет искать БД в рабочей папке вашего приложения. Разрешается также задавать относительные пути. Например, если БД находится во вложенном каталоге Data рабочей папки приложения, можно ука зать такую строку подключения:

Data Есть и другие способы подключения с помощью поставщика Jet OLE DB. Подроб нее Ч в документации Microsoft Data Access SDK. Сейчас я покажу два наиболее часто используемых способа. Первый Ч подключение к БД Access с использова нием системы безопасности Jet:

Data Второй подключение к БД, защищенной паролем:

Data Jet Поставщик OLE DB для драйверов ODBC Если вы работали с ADO, то, возможно, знакомы с поставщиком OLE DB для драй ODBC, который обычно называют по его кодовому имени Ч В па 48 Часть II Подключаемся: использование поставщика данных кете Microsoft Data Access Components версий младше 2 это единственный ком понент с такой функциональностью. Kagera выступает в роли моста между OLE DB и предыдущей технологией доступа к данным. ODBC, преобразуя вызовы OLE DB в вызовы API ODBC. Данный поставщик позволяет разработчикам взаи модействовать с драйверами ODBC при помощи ADO.

Взаимодействие с Kagera посредством поставщика OLE DB может пока заться сложной что, в общем-то, правда. Именно поэтому команда раз работчиков Microsoft создала поставщик ODBC (подробнее о нем Ч в при ложении А).

Для взаимодействия с источником данных через драйвер ODBC следует обра титься к поставщику ODBC Если вы попытаетесь использовать Kagera совме стно с поставщиком OLE DB система сгенерирует исключение, Создание строк подключения в коде при помощи диалогового окна Data Links Чтобы создавать строки подключения в коде, в Visual Studio как и в Visual Studio 6, можно воспользоваться диалоговым окном Data Links. В нем следует выбрать поставщика OLE DB и затем указать расположение источника данных, имя пользователя, пароль и другие атрибуты поставщика. С этим окном вы уже познако мились при создании подключения с помощью мастера Data в главе 2.

Чтобы сделать окно Data Links доступным в среде Visual Studio следует добавить ссылку на библиотеку Data Link. Щелкните свой проект в окне Project Explorer правой кнопкой и выберите Add Reference. Перейдите на вкладку СОМ диалогового окна Add Reference и добавьте ссылки на библиотеки Microsoft ActiveX Data Objects 2.7 Library (обычно ее называют ADO) и Microsoft OLE DB Service Component 1.0 Type Library (рис. 3-2).

Примечание Эти библиотеки содержат Когда вы добавляе те ссылку на них, Visual Studio предлагает создать оболочку для библиотек, В нашем примере щелкните Yes. Подробнее о взаимодействии с СОМ Ч в документации MSDN.

Следующий код обращается к окну Data Links и получает возвращаемую им строку подключения, основанную на введенных пользователем данных:

Visual Basic Dim As New Dim As New Visual C# MSDASC.DataLlnks objDataLink = new = new object objCn = ГЛАВА 3 Подключение к базе данных Add Reference сом I OLAP 1, Microsoft OLAP Designer Driver 8. Microsoft ActiveX Data Microsoft OLE provider for OLAP 1. I DB provider for Provider 1 Microsoft Outlook 9,0 Object 9. Microsoft 6. j I ActiveX 2.7 Library COM Рис. 3-2. Диалоговое окно Add Reference Если вы, как и я, не способны запомнить атрибуты строки воспользуйтесь диалоговым окном Data Links: здесь можно быстро задать пара метры и просмотреть получившуюся строку Это позволяет сконцен трироваться на более серьезных проблемах, например на том, что пишет Питер (Peter Gammons) о моей любимой команде Red Sox Б своей колонке Web узла ESPN.

Создание строк подключения вручную при помощи диалогового окна Data Links Вам не придется писать код, который проверял бы строки подключения, создава емые средствами диалогового окна Data Links. Достаточно лишь создать файл с расширением и он будет связан с окном Data Links. Дважды щелкните этот файл и задайте необходимые параметры на вкладках открывшегося окна. Ч это простой текстовый файл, можно в редакторе типа Notepad.

Новая строка подключения готова.

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

File 50 Часть II Подключаемся: использование поставщика данных Если полный путь к не указан, поставщик данных OLE DB ищет этот файл в текущем рабочем каталоге приложения. В строке подключения раз решается также задать путь:

File Открытие и закрытие соединений Получив объект с действительной строкой устано вите соединение для взаимодействия с хранилищем данных. Чтобы открыть со единение, вызовите метод Open объекта OleDbConnection:

Visual Basic Dim As String = Data & _ "Initial Dim As New Visual C# string strConn = + "Initial new OleDbConnection(strConn);

Закрыть соединение можно, вызвав метод Visual Basic strConn As String = & "Initial Dim As New Visual string strConn = + OleDbConnection = new OleDbConnection(strConn);

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

Использование пула соединений Открытие и закрытие соединений с БД Ч дорогостоящие операции. Использова ние пула соединений при разработке многоуровневого приложения позволяет значительно повысить его производительность.

ГЛАВА 3 Подключение к базе данных Что такое пул соединений Концепция пула соединений весьма простя. Представьте многоуровневое прило жение, аналогичное изображенному на рис. 3-3.

С уровня ч приложение V \ \ \ приложение Ч я Х \ Клиентское / Ч приложение Connection Рис. Обычное многоуровневое приложение Когда клиентское приложение активно взаимодействует с сервером промежу точного уровня, тот создает подключающийся и выполняющий запросы к БД. Каждый бизнес-объект открывает собственное соединение. Все новые бизнес-объекты, созданные сервером промежуточного уровня, создают новые объекты Connection. Когда сервер промежуточного уровня освобождает бизнес объект, тот закрывает и освобождает свое соединение с БД.

Обычно бизнес-объект закрывает соединение в своем коде очистки. Как уже упоминалось, подключений к БД Ч дорогостоящая задача. Что, если вместо закрытия соединения с БД мы поместим его в пул? Тогда новые бизнес объекты будут проверять наличие соединений в пуле. Если имеется открытое со единение, бизнес-объект станет использовать именно его. В противном случае он создаст новое соединение. Пример организации пула соединений показан на рис. 3-4.

Как видно, ничего сложного в организации пула соединений в ADO.NET нет.

Фактически, все даже еще проще. Каждый поставщик данных из состава ADO.NET реализует пул соединений. Когда вы запрашиваете новое поставщик просматривает переданные вами реквизиты (размещение БД, имя пользователя и т.д.) и ищет в пуле открытое соединение с аналогичными пара метрами подключения. Если соединение найдено, поставщик передает его вам. В противном случае он создает и возвращает новое соединение.

Когда вы уничтожаете объект поставщик данных не закрыва ет реальное соединение с БД. Он помечает объект как уничтоженный, но поме щает соединение в пул. Если в течение заданного периода времени (по умолча нию Ч 60 секунд) соединение не используется повторно, поставщик данных закрывает его.

52 Часть II Подключаемся: использование поставщика данных Рис. 3-4. Многоуровневое приложение, использующее пул соединений Как включить пул соединений Очень просто Ч пул соединений включен по Следующий фрагмент кода пять раз создает и уничтожает один и тот же объект Connection. Так как пул соединений по умолчанию включен, при вызове метода Close соединение с БД не разрывается. Вместо этого оно помещается в пул для использования.

Basic As String = & "Initial Dim As New Dim intCounter As Integer For intCounter = 1 To Next Visual C# string strConn = + "Initial = new (int intCounter = 1;

intCounter <= 5;

I ГЛАВА 3 Подключение к данных } Пул соединений обрабатывается отдельным в результате чего код имеет возможность открыть второе соединение с БД. В некоторых случаях, когда код на второй итерации цикла For подходит к методу оказывается, что управления пулом соединений еще не поместила начальное соединение в пул.

Между вызовом метода Close объекта Connection и концом цикла For можно доба вить следующую строку, чтобы приостановить текущий поток и позволить выпол няться другим потокам. При этом код только одно соединение с БД:

Что делать, если не надо помещать соединения в пул А здесь все несколько сложнее, чем раньше. Например, при использовании клас сического двухуровневого в котором клиент взаимодействует непос редственно с БД, пул соединений не нужен, но по умолчанию он включен. Так как же его выключить?

Класс реализует метод который можно использовать совместно с методом осуществляющего глобальный сбор мусора, чтобы на самом деле закрыть физическое соединение с БД. Однако есть более изящный способ. В строку подключения OLE DB надо добавить следу ющий атрибут:

OLE DB Services=-4;

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

Если вы используете объект SqlConnection, в подключения можно доба вить атрибут, указывающий поставщику что соединение не нужно помещать в пул:

Как узнать, действительно ли закрыто соединение или оно просто помещено в пул множество способов проверки числа подключений к SQL Server, однако не все они одинаково удобны. Я предпочитаю просматривать число подключений к моим БД средствами SQL Profiler или Performance Monitor. Другие пользуются Enterprise Manager или просматривают результат многократного вызова систем ной хранимой процедуры.

Разрыв соединений Многие классы объектной модели ADO.NET, например класс предо ставляют метод Dispose. При его вызове объект освобождает занимаемые ресур сы, затем осуществляется сбор мусора. Если не вызвать метод Dispose явно, объект освободит ресурсы только тогда, когда ему предложит сделать это сбора мусора среды CLR (Common Language Runtime).

54 Часть II Подключаемся: использование поставщика данных Если вы попытаетесь закрыть соединение с источником Connection выйти за пределы своей области действия или задав объект ной переменной значение null или оно останется открытым до тех пор.

пока объект Connection не будет убран при сборе мусора. Если вызвать метод Dispose для открытого соединения, неявно вызывается метод Close объекта Connection.

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

Создание других объектов с помощью объектов Connection Объекты Connection можно использовать для создания объектов Tran что иногда позволяет сэкономить пару строк кода.

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

Следующие фрагменты кода эквивалентны:

Visual Basic Dim As String = Data & "Initial Dim As New Dim As New = Ч или Dim strConn As String = & "Initial Dim As New Dim cmd As = Visual C# string strConn = + "Initial new cmd = new OleDbCommandO;

= Ч или Ч string strConn = + "Initial ГЛАВА 3 Подключение к базе данных = new cn.CreateCommandO;

В некоторых случаях, когда мне нужно создать объект Command однократно го я применяю в коде Visual Basic метод При совместном использовании этого метода и блока можно создавать объект Command, не явно имя переменной:

Visual With cn.CreateCommandO = "CREATE TABLE.

End With С* предоставляет аналогичную функциональность посредством использования оператора. Основное различие в том, что код на С* в конце блока With явно вы зывает метод Dispose объекта а код на Visual Basic не делает этого. Поэтому я добавил в код вызов метода Dispose объекта OleDbCommand.

Visual C# using = cn.CreateCommandO = TABLE MyTable cmd. ExecuteNonQueryO;

} Стоит ли использовать такие программные конструкции Ч спорный вопрос.

Кто-то может сказать, что приведенный выше фрагмент кода краток и изящен.

Другие считают, что в результате создается неаккуратный и трудный в обслужи вании код. Лично мне данный фрагмент кода нравится. При работе над этой книгой я написал в Visual Studio бесчисленное множество примеров кода, использу ющего поставщики данных OLE DB, SQL и ODBC Если изменить определе ние объекта Connection с на (вместе со строкой подключения, код, создающий и выполняющий объект Command, менять не придется. Иногда все же стоит присмотреться и к глупым программи стским трюкам.

Выполнение транзакций Объект Connection также позволяет начинать транзакции. Метод объекта Connection возвращает для вашего соединения новый открытый объект (подробнее о нем в главе 10).

Следующие фрагменты кода эквивалентны:

Visual Basic Dim strConn As String = & _ "Initial Dim As New cn.OpenO 56 Часть II Подключаемся: использование поставщика данных Dim txn As New = Ч или Ч Dim strConn As String = "Initial Dim As New Dim txn As = Visual C# string strConn + "Initial = new OleDbConnection(strConn);

OleDbTransaction txn = new = txn.BeginO;

Ч или Ч string strConn = Data + "Initial OleDbConnection = new OleDbTransaction txn = Получение информации схемы БД Метод объекта OleDbConnection позволяет получать инфор мацию схемы БД. Чтобы указать нужный тип информации (таблицы, стол бцы или процедуры), передайте методу значение из перечисления Метод GetOleDbSchemaTable также принимает обязательный параметр который служит фильтром для возвращаемых сведений схемы. вместо того, чтобы получать информацию обо всех столбцах БД, можно получить сведе ния о столбцах конкретной таблицы. Параметр Restrictions содержит массив зна чений. Каждый схемы допускает использование разных наборов ограничений.

Чтобы получить информацию обо всех столбцах всех таблиц вашей БД. опус тите параметр Restrictions;

Visual Basic Dim strConn As String = & "Initial As New OleDbConnection(strConn) Dim As DataTable = Nothing) ГЛАВА 3 Подключение к данных Visual C# string strConn "Initial = new DataTable = null);

Если требуется получить столбцы конкретной таблицы, воспользуйтесь метром и укажите имя нужной таблицы. В документации MSDN указа но, что структура массива Restrictions для элемента перечисления должна быть такой:

Таким следующий код возвращает список столбцов таблицы Customers:

Visual Basic Dim strConn As String = _ "Initial Dim As New Dim objRestrictions As obj Rest = New Object() Dim tbl As DataTable tbl = objRestrictions) Visual C# string strConn = Data + "Initial OleDbConnection = new cn.OpenO;

string objRestrictions;

objRestrictions = new "Customers", DataTable tbl;

tbl = objRestrictions);

Подробнее о составляющих параметра Restrictions для конкретных значений Ч в документации Метод возвращает объект DataTable (подробнее о нем Ч в главе 6), содержащий нужную вам информацию схемы. Структура ного методом объекта DataTable зависит от типа запрошенной вами схемы. Сле дующий код просматривает записи таблицы со списком полей, возвращенной методом Visual Basic tbl = strRestrictions) 58 Часть II Подключаемся: использование поставщика данных in Customers Each row In & Next Visual C# = in Customers row in Можно простое приложение, которое с помощью метода будет выводить информацию схемы о вашей БД представле хранимые процедуры и т.д.), почти так же, как это делает Server Explorer.

Метод основан на функциональности поставщика OLE вашим объектом He все поставщики предостав ляют все методы для работы со схемой. Если вы запросите схему, не поддержива емую вашим поставщиком OLE DB, приложение сгенерирует перехватываемое ключение.

Функции среды Visual Studio доступные в период разработки Среда Visual Studio предоставляет ряд функций, упрощающих создание и использование объектов в период разработки.

Работа с объектами Connection в окне Server Explorer Команда разработчиков ADO.NET спроектировала эту модель таким образом, чтобы вы могли создавать быстрые и масштабируемые приложения для взаимодействия с Команда разработчиков Visual Studio встроила в дан ную среду ряд функций, ускоряющих разработку таких приложений. Одна из функций Ч Server Explorer.

Server Explorer позволяет просматривать службы операционной системы и интегрировать их в приложения. На рис. 3-5 в окне Server Explorer перечислены различные службы ОС, в том числе и журналы событий, очереди сообщений и счетчики производительности. Элементы из Server Explorer можно перетаскивать на различные поверхности на формы и компоненты в Visual Studio что на этапе разработки создание компонентов, к которым вы будете обращаться в период выполнения.

приложение должно дополнять или обращаться к журналу бок системы, перетащите элемент из контейнера Event Logs дерева Explorer в конструктор и затем добавьте в приложение соответствующий код вызова, Server Explorer также позволяет взаимодействовать с БД из среды Visual Studio, Одна из служб, которые Server Explorer через свой серверный ин терфейс, Ч SQL Server. Кроме того, в верхней части дерева Server Explorer имеет ся отдельный контейнер под названием Data Connections.

ГЛАВА 3 Подключение к данных Рис. 3-5. Visual Studio Server Explorer В главе 2 мы одно из диалоговых окон мастера Data Wizard, в котором вводится информация о подключении. После ввода в этом окне всех необходимых сведений Visual Studio добавляет элемент в контейнер Data Connec tions дерева Server Explorer (рис. 3-6).

-6. Контейнер Data Connections дерева Server Explorer Вложенные элементы узла соединения зависят от типа БД, к которой вы под ключаетесь. В большинстве БД имеются таблицы, представления и хранимые про цедуры. В некоторых БД, например, в последних версиях БД Oracle и SQL Server функции и диаграммы БД. Кроме того, БД Oracle поддерживают синонимы и па кеты. Сведения обо всех этих объектах БД доступны в Server Explorer.

Чтобы просмотреть список столбцов таблицы, раскройте ее контейнер. Если щелкнуть в окне Properties отобразятся его свойства. Чтобы просмотреть содержимое таблицы или представления, щелкните нужный элемент правой кноп кой и выберите Retrieve Data From Table. Server Explorer отобразит содержимое таблицы или в сетке. Если у вас есть соответствующее разрешение, Часть II Подключаемся: использование поставщика данных вы сможете обновлять данные, и Server Explorer получит значения ключа, необ ходимые для передачи изменений в БД.

При работе с Visual Studio Enterprise Edition можно также управлять ва шими БД SQL Server и Oracle. Вы имеете право изменять, создавать и удалять таб представления, хранимые процедуры, диаграммы БД и функции SQL Server и Добавление соединений в Server Explorer Чтобы добавить соединение в дерево Server Explorer, щелкните расположенную в части окна Server Explorer кнопку со значком желтого цилиндра и под соединенного электрического кабеля. Откроется то же диалоговое окно (рис.

котором мы создавали соединение при работе с мастером Data Form Рис. 3-7. Добавление нового соединения в дерево Server Explorer средствами диалогового окна Data Link Properties Примечание На диаграммах базы данных практически всегда обозначают цилиндром. Не могу сказать точно, почему это так, но, по словам моего технического редактора Дейла, лцилиндр Ч старый символ блок-схем, обозначающий массовые запоминающие устройства, выбранный для этой цели потому, что на заре вычислительной техники в массовых ЗУ исполь зовались барабаны, а не Кроме того, прежде чем сказать: Уби райся и дай мне спокойно принять мои таблетки для восстановления Дейл заявил, что не слишком стар, чтобы помнить такие уст ройства. Что поделаешь, он всегда раздражается, если не вздремнет после обеда.

Поставщики данных OLE DB, ODBC и Добавление соединений в Server Explorer далеко не всегда простая задача. Что бы понять, почему это так, мы рассмотрим новые и старые низкоуровневые техно логии доступа к данным. Возможно, следующие пара-тройка страниц покажутся ГЛАВА 3 Подключение к базе данных вам набором слов, Они предназначены разработчикам, собирающимся использо вать драйверы ODBC и поставщики данных от поставщиков OLE DB и SQL Server.

Впервые диалоговое окно Data Link как интерфейс для создания строк подклю чения появилось в Studio 6. Основная технология доступа к данным в шес той версии, основана на низкоуровневой технологии под названием OLE DB, На вкладке Providers диалогового окна Data Link отображается список постав щиков OLE DB для подключения к конкретным типам БД, например SQL Server, Oracle или Microsoft Access.

До появления OLE DB для к данным разработчики использовали тех нологию ODBC и взаимодействовали с БД через драйверы ODBC. Фактически многие по-прежнему создают приложения, использующие драйверы ODBC, так как для некоторых БД нет поставщиков OLE DB.

Первый поставщик OLE DB, разработанный Microsoft, стал мостом между дву мя технологиями, преобразовывавшим вызовы OLE DB в вызовы ODBC. Это по зволило разработчикам взаимодействовать с драйверами ODBC при помощи ADO, использовавшей поставщики OLE DB. Этот первый поставщик указан на вкладке Providers диалогового окна Data Link как Microsoft OLE DB Provider For ODBC Drivers.

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

Ранее я уже рассказывал, как с помощью диалогового окна Data Link подклю читься к данных, используя OLE DB или ODBC. А что насчет постав щиков данных Как уже упоминалось, диалоговое окно Data Link появилось в Visual Studio 6. На момент появления Visual Studio позволяю щего создавать строки подключения для поставщиков данных не было. Та ким образом, добавить соединение в Server Explorer удается, только если для ного источника данных имеется поставщик OLE DB или драйвер ODBC.

Сохранение пароля В диалоговом окне Data Link вы можете ввести пароль и щелкнуть Test, чтобы проверить возможность установки По соображениям безопасности окно Data Link не сохраняет пароль для новой строки подключения, если не помечен фла жок Allow Saving Password. Если его установить, система выдаст предупреждение, показанное на рис. 3-8.

Рис. 3-8. Предупреждение, которое появляется при попытке сохранить пароль в строке подключения Если вы решите сохранить пароль в строке он будет использо ваться Server Explorer в период разработки и созданными вами приложениями в период выполнения. Таким образом, вам не придется вводить пароль при каждом подключении Server Explorer к БД. Однако при этом пароль будет встроен в при ложение.

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