Использование объектов подключения и набора записей ADO. Технология ADO

Подключение к базе данных

Первое, что нужно сделать при работе с поставщиком данных - это установить сеанс с источником данных с помощью объекта подключения (порожденного, как вы помните, от DbConnection). У объектов подключения.NET имеется форматированная строка подключения, которая содержит ряд пар имя/значение, разделенных точками с запятой. Эта информация содержит имя машины, к которой нужно подключиться, необходимые параметры безопасности, имя базы данных на этой машине и другую информацию, зависящую от поставщика.

В следующем коде иллюстрируется создание, открытие и закрытие соединения с базой данных SqlServer:

// Создание открытого подключения using (SqlConnection cn = new SqlConnection()) { cn.ConnectionString = @"Data Source=MICROSOF-1EA29E\SQLEXPRESS;Initial Catalog=AutoLot;" + "Integrated Security=SSPI;Pooling=False"; cn.Open(); // Работа с базой данных cn.Close(); }

Из приведенного выше кода можно понять, что имя Initial Catalog относится к базе данных, с которой нужно установить сеанс. Имя Data Source определяет имя машины, на которой расположена база данных. Элемент (local) позволяет указать текущую локальную машину (независимо от конкретного имени этой машины), а элемент \SQLEXPRESS сообщает поставщику SQL Server, что вы подключаетесь к стандартной инсталляции SQL Server Express (если вы создали AutoLot с помощью полной версии SQL Server 2005 или более ранней, укажите Data Source=(local)). В данном примере я использовал вместо (local) полное название имени компьютера (MICROSOF-1EA29E), на котором развернута версия SQL Server.

Кроме того, можно указать любое количество элементов, которые задают полномочия безопасности. В нашем примере имени Integrated Security присвоено значение SSPI (что эквивалентно true), которое использует для аутентификации пользователя текущие полномочия учетной записи Windows.

Назначение каждой пары имя/значение для вашей СУБД можно узнать в документации по NET Framework 4.0 SDK, в описании свойства ConnectionString объекта подключения для вашего поставщика данных.

При наличии строки подключения вызов Open() устанавливает соединение с СУБД. В дополнение к членам ConnectionString, Open() и Close() объект подключения содержит ряд членов, которые позволяют настроить дополнительные параметры подключения, например, время тайм-аута и информацию, относящуюся к транзакциям.

Ниже приведены некоторые члены базового класса DbConnection:

BeginTransaction()

Используется для начала транзакции базы данных

ChangeDatabase()

Изменяет базу данных для открытого подключения

ConnectionTimeout

Свойство только для чтения. Возвращает время ожидания при установке подключения, после которого ожидание прекращается и выдается сообщение об ошибке (по умолчанию 15 секунд). Для изменения этого времени нужно изменить в строке подключения сегмент Connect Timeout (например, Connect Timeout=30)

Database

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

DataSource

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

GetSchema()

Этот метод возвращает объект DataTable, содержащий информацию схемы из источника данных

State

Свойство только для чтения. Содержит текущее состояние подключения в виде одного из значений перечисления ConnectionState

Свойства типа DbConnection предназначены в основном только для чтения и поэтому нужны, если требуется получить характеристики подключения во время выполнения. Если понадобится изменить стандартные значения, необходимо будет изменить саму строку подключения. Например, можно изменить время тайм-аута с 15 на 30 секунд:

Cn.ConnectionString = @"Data Source=..." + "Connect Timeout=30"

Программная работа со строками подключения может оказаться несколько затруднительной, поскольку они часто представлены в виде строковых литералов, которые трудно обрабатывать и контролировать на наличие ошибок. Поставщики данных ADO.NET, разработанные Microsoft, поддерживают объекты построителей строк подключения (connection string builder object) (аналог StringBuilder), которые позволяют устанавливать пары имя/значение с помощью строго типизированных свойств. Рассмотрим следующую модификацию нашего метода Main():

// Создание строки подключения с помощью объекта построителя SqlConnectionStringBuilder connect = new SqlConnectionStringBuilder(); connect.InitialCatalog = "Autolot"; connect.DataSource = @"(local)\SQLEXPRESS"; connect.ConnectTimeout = 30; connect.IntegratedSecurity = true; // Создание открытого подключения using (SqlConnection cn = new SqlConnection()) { cn.ConnectionString = connect.ConnectionString; cn.Open(); // Работа с базой данных cn.Close(); }

В этом варианте создается экземпляр SqlConnectionStringBuilder, устанавливаются его свойства, и выбирается внутренняя строка из свойства ConnectionString. Здесь использован стандартный конструктор типа. При этом можно также создать экземпляр объекта построителя для строки подключения поставщика данных, передав в качестве отправной точки существующую строку подключения (это может оказаться удобным при динамическом чтении значений из файла App.config).

Эффективное использование соединений

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

Событие возникает перед выполнением команды. Параметры:
  • Source - строка, содержащая оператор SQL или имя хранимой процедуры.
  • CursorType - тип курсора для Recordset, который будет открыт. Тип курсора можно изменять. Возможные значения:
    • adOpenUnspecified(-1) - тип курсора не определён.
    • adOpenForwardOnly(0) - определяет forward-only курсор. То же, что и статический курсор, но вы можете прокручивать записи только вперед. Это оптимизирует выполнение, если вы должны сделать только один проход по Recordset"у.
    • adOpenKeyset(1) - Определяет keyset-курсор. То же, что и динамический курсор, но вы не можете видеть записи, добавляемые другими пользователями, хотя записи, удаляемые другими пользователями, недоступны в вашем Recordset"е. Изменения данных другими пользователями видимы.
    • adOpenDynamic(2) - Определяет динамический курсор. Добавления, изменения и удаления другими пользователями видимы; разрешены все типы движения через Recordset, исключая закладки, если провайдер их не поддерживает.
    • adOpenStatic(3) - Определяет статический курсор. Статическая копия набора записей, которую вы можете использовать, чтобы найти данные или генерировать отчёты. Добавления, изменения или удаления другими пользователями не видимы.
  • LockType - тип блокировки для Recordset, который будет открыт. Возможные значения:
    • adLockUnspecified(-1) - тип блокировки не определён.
    • adLockReadOnly(1) - только для чтения. Вы не можете изменить данные.
    • adLockPessimistic(2) - пессимистическая блокировка. Провайдер гарантирует успешное редактирование записей. Запись блокируется сразу после начала редактирования и до момента сохранения записей.
    • adLockOptimistic(3) - оптимистическая блокировка. Провайдер осуществляет блокировку записей только в момент сохранения изменений, т.е. когда вы вызываете метод Update().
    • adLockBatchOptimistic(4) - оптимистические пакетные модификации. Требуется для пакетного режима модификации (отложенное сохранение записей).
  • Options - целое число (long), указывающее опции выполнения команды или открытия Recordset"а.
  • adStatus - определяет состояние события. Возможные значения - см. описание аналогичного параметра события ConnectComplete.
  • pCommand - объект Command, для которого применяется это событие.
  • pRecordset - объект Recordset, для которого применяется это событие.
  • pConnection - объект Connection, для которого применяется это событие.
Событие WillExecute может произойти из-за вызовов Connection.Execute, Command.Execute, или Recordset.Open. Параметр pConnection всегда содержит ссылку на объект Connection. Если событие происходит из-за вызова Connection.Execute, параметры pRecordset и pCommand будут установлены в Nothing. Если событие происходит из-за вызова Recordset.Open, параметр pRecordset будет содержать ссылку на объект Recordset, а параметр pCommand будет установлен в Nothing. Если событие происходит из-за вызова Command.Execute, параметр pCommand будет содержать ссылку на объект Command, а параметр pRecordset будет установлен в Nothing.

Аннотация: На этой лекции мы поговорим о механизмах доступа к данным BDE и ADO, обсудим их плюсы и минусы. Создадим базу данных с помощью программы MS Access. Затем создадим приложение, которое работает с этой базой данных, используя механизм ADO.

С самого появления технологии баз данных программисты испытывали потребность в механизмах доступа к этим самым данным. Различные компании по-своему пытались предоставить им такую возможность. Например, для работы с таблицами типа dBase была создана Система Управления Базами Данных (СУБД ) Clipper . Для времен операционной системы MS-DOS - превосходное решение. Однако Clipper не мог работать ни с какими другими типами таблиц. И чем больше типов данных появлялось, тем острее вставала необходимость разработать универсальный инструмент доступа, который мог бы работать с любым типом данных.

Механизм доступа к данным - это программный инструмент, позволяющий получить доступ к базе данных и ее таблицам. Как правило, это драйвер в виде *.dll файлов, который устанавливается на ПК разработчика (и клиента), и который используется программой для связи с БД.

Сравнение BDE и ADO

Borland Database Engine (BDE) - первая такая разработка фирмы Borland . Этот механизм доступа к данным позволяет обращаться к локальным и файл-серверным форматам баз данных dBase , FoxPro и Paradox , к различным серверам SQL и ко многим другим источникам данных, доступ которых поддерживался при помощи драйверов ODBC . Например, с помощью BDE можно напрямую работать с табличными файлами MS Excel . Увы, механизм доступа BDE признается устаревшим даже самой компанией Borland . В данный момент многие инструменты Delphi являются кросс - платформенными, то есть, программы с небольшими доработками можно переносить на другие операционные системы. Корпорация Borland выпустила новую среду быстрой разработки программ - Kylix , на которой создаются приложения для операционных систем семейства Linux . Часто говорят, что Kylix - это Delphi для Linux . Так и есть - если вы умеете программировать на Delphi , сумеете и на Kylix . Большинство инструментов Delphi были унаследованы Kylix , но, увы, не BDE . Дальнейшее развитие этого механизма доступа к данным корпорацией Borland прекращено.

Тем не менее, хоронить его рано. Многие программисты до сих пор используют данный инструмент в разработке приложений для небольших компаний. Да что там говорить, китайская компания Huawei , разрабатывающая современнейшие электронные АТС как для городских, так и для мобильных телефонов, до сих пор использует BDE для доступа к настройкам и статистическим данным этих АТС! Кроме того, BDE имеет множество простых и удобных возможностей для программиста, таких например, как создание таблиц программно.

Удобство работы с BDE трудно переоценить, однако нельзя не сказать и о минусах. Основной минус - распространение приложений. Если ваше приложение использует для доступа к данным компоненты BDE , то и у клиента, который будет пользоваться вашей программой, должен быть установлен BDE . Причем если вы использовали алиасы (псевдонимы базы данных), то настройка на эти же алиасы должна быть и у клиента. Впрочем, создание инсталляционного пакета при помощи стандартной утилиты Install Shield Express снимает эту проблему. Эта утилита позволяет включать настроенный механизм BDE в состав инсталляционного пакета вашей программы. Конечно, за это приходится расплачиваться большими размерами инсталляционного файла.

Другой минус касается не только BDE , но и любого другого универсального механизма доступа к данным . Универсальность такого механизма подразумевает сложность его реализации. Программисту предоставляется уже готовый инструмент, с которым удобно работать, однако этот инструмент достаточно "тяжелый" - используя его, вы довольно существенно увеличиваете размеры своего приложения.

На предыдущем курсе "Введение в программирование на Delphi " мы затрагивали работу с базами данных посредством BDE . Больше к этим темам мы возвращаться не будем, хотя изредка будем обращаться к BDE , чтобы продемонстрировать те или иные возможности, отсутствующие в других механизмах доступа к данным, или отличающиеся от них. Поэтому если вы пропустили этот курс, то хотя бы бегло просмотрите работу с BDE в лекциях 29-32.

ActiveX Data Object (ADO) - это механизм доступа к данным , разработанный корпорацией Microsoft . Если точнее, то ADO - это надстройка над технологией OLE DB , посредством которой можно связываться с различными данными приложений Microsoft . В середине 1990-х годов большое развитие получила технология COM , и корпорация Microsoft в связи с этим объявила о постепенном переходе от старой технологии ODBC к новой OLE DB . Однако технология OLE DB достаточно сложная, использование этой технологии происходит на системном уровне и требует от программиста немало знаний и труда. Кроме того, технология OLE DB очень чувствительна к ошибкам, и "вылетает" при первом удобном случае. Чтобы облегчить программистам жизнь, корпорация Microsoft разработала дополнительный прикладной уровень ADO , который мы будем изучать на этом курсе.

По своим возможностям ADO напоминает BDE , хотя конечно, является более мощным инструментом. Компания Borland разработала набор компонентов для доступа к ADO и первоначально назвала его ADOExpress . Однако корпорация Microsoft упорно противится использованию своих обозначений в продуктах сторонних разработчиков, поэтому, начиная с Delphi 6, этот набор компонентов стал именоваться dbGo . Эти компоненты вы можете увидеть на вкладке ADO палитры компонентов .

Технология ADO , как и BDE , независима от конкретного сервера БД, имеет поддержку как локальных баз данных различных типов, так и некоторых клиент-серверных БД. Плюсов у этой технологии много. Драйверы, разработанные корпорацией Microsoft для собственных нужд, более надежные, чем драйверы сторонних производителей. Поэтому если вам требуется работать с базами данных MS Access или для архитектуры клиент-сервер использовать MS SQL Server , то использование ADO будет наиболее предпочтительным. Кроме того, имеется плюс и в вопросе распространения программ - во всех современных Windows встроены драйверы ADO . Другими словами, ваша программа будет работать на любом ПК, где установлен Windows .

Как ни странно, но основной минус так же заключается в вопросе распространения программ. Корпорация Microsoft поступает довольно хитро. Каждые пару-тройку лет появляются новые версии Windows . Рядовому пользователю обычно нет нужды переходить на свежую ОС, тем более что каждая новая система становится все требовательней к ресурсам ПК. Для того чтобы заставить пользователя перейти на новую версию, корпорация Microsoft обязательно вводит несколько новых стандартов или технологий, несовместимых со старыми. А для старых версий доработок не предусматривается. Вот и приходится бедному пользователю скрепя зубы тратиться на новые версии операционной системы и пакета MS Office . Поэтому при использовании технологии ADO приходится думать о том, какая версия Windows стоит у конечного пользователя, будет ли ваша программа работать у него на ПК.

Технология ADO на самом деле является частью Microsoft Data Access Components (MDAC) . Компания Microsoft распространяет MDAC как отдельный продукт, к счастью, бесплатный. При этом поддерживается только самая последняя версия MDAC . Например, в состав Delphi 7 входит MDAC 2.6 . При распространении собственных программ следует учитывать, что у клиента с большей долей вероятности уже установлена эта самая MDAC , причем самой последней версии. Однако если он пользуется старыми версиями Windows (Win95, 98, ME, NT), то вам потребуется позаботиться об установке MDAC на его компьютер. Если же у него установлена ОС Win2000, WinXP или более новая, то MDAC у него уже есть, и вам беспокоиться не о чем.

Еще один серьезный минус ADO в том, что он для подключения к БД использует довольно медлительную технологию COM . Если ваша база данных будет содержать несколько тысяч записей, то скорость работы с таблицами может стать в сотни раз более медленной, чем если бы вы использовали BDE ! На современных ПК, имеющих частоту процессора до 2 ГГц и выше, эти замедления могут быть и незаметны, но работа с огромной базой данных на более медленных ПК превратится в сплошное ожидание.

Основными компонентами, с которыми нам предстоит работать, являются TADOConnection (для подключения к БД), TADOTable (аналог TTable из BDE ), TADOQuery (аналог TQuery из BDE , для выполнения запросов и получения набора данных) и TADODataSet (предназначенный для набора данных, полученных через SQL-запрос).

Создание базы данных MS Access

Базы данных MS Access имеют много плюсов, часто программисты предпочитают использовать именно их. Во-первых, база данных MS Access - это один файл. Сколько бы таблиц и индексов она не содержала, все это хранится в одном единственном файле. А значит, такую базу данных легче обслуживать - переносить на новое место, делать резервные копии и так далее. Еще один плюс - имена полей в такой БД можно давать русскими буквами.

Лучше всего изучать новый материал на практике. Для примера создадим базу данных для отдела кадров какого-нибудь предприятия. Какие данные на сотрудника нам понадобятся? Прежде всего, фамилия, имя и отчество. Затем укажем пол (мужской или женский), семейное положение (холост или женат/замужем), количество детей. Также понадобятся дата рождения и дата поступления на работу. Стаж работы в годах. Образование. Военнообязанный сотрудник, или нет. Телефоны, по которым можно связаться с сотрудником в любое время. Должность сотрудника и отдел (если есть), в котором он числится. А также его домашний адрес. При этом учитываем, что сотрудник не обязательно является жителем города, где он работает. А вдруг он приехал на заработки из другого города? Или даже из другой страны? Следовательно, придется вводить и страну, и город - вдруг потребуется делать отчет по сотрудникам, прописанным в Украине, например? Вот сколько данных нужно будет вводить для отдела кадров! А ведь мы еще немного упростили их. Стаж работы подразделяется на общий и непрерывный. Эти данные учитываются при расчете больничных листов. Но для учебной базы данных такими деталями можно пренебречь.

Итак, первым делом оптимизируем данные, исходя из правил трех нормальных форм . В результате получаем целых четыре таблицы:


Рис. 2.1.

Главной здесь будет таблица LichData , которая содержит основные данные о сотруднике. Она имеет релятивные связи с другими таблицами. Поле "Ключ" будет автоинкрементным, то есть автоматически будет прибавляться на единицу, гарантируя нам уникальность ключа . В подчиненных таблицах имеется поле "Сотрудник" целого типа, по которому будет обеспечиваться связь. Причем ключевых полей в дочерних таблицах не будет.

Главная таблица поддерживает связь один-к-одному с таблицами Doljnost и Adres , и связь один-ко-многим с таблицей Telephones , ведь у сотрудника наверняка есть и домашний, и рабочий телефоны, а в карманах, возможно, лежит пара мобильников. То есть, один сотрудник может иметь много телефонов.

С полями и связями определились, пора создавать базу данных. Для этого загрузите программу MS Access .

Если в правой части окна у вас нет панели "Создание файла", то выберите команду "Файл -Создать". Затем выберите команду "Новая база данных". Сразу же выйдет запрос с именем этой базы данных. Создайте папку, которая все равно нам понадобится для нового проекта, укажите эту папку, а базу данных назовите ok (отдел кадров). Как только вы нажмете кнопку "Создать", появится окно этой базы данных:


Рис. 2.2.

Сейчас нам потребуется сделать четыре таблицы. Поэтому дважды щелкаем по команде "Создание таблицы в режиме конструктора", и переходим к конструктору. В левой части мы вводим имя поля, причем русскими буквами. В поле "Тип данных выбираем тип", а на вкладке "Общие" делаем настройки поля. Описание поля заполнять необязательно. Итак, создаем поля:

  1. "Ключ". Разумеется, имя поля пишем без кавычек. Выбираем тип данных "Счетчик", это автоинкрементный тип данных. В настройках убедитесь, что поле индексированно - Да (Совпадения не допускаются). Правой кнопкой щелкните по этому полю и выберите команду "Ключевое поле". Слева от поля появится значок ключа.
  2. "Фамилия". Тип поля текстовый, размер 25 символов. Индексированное поле - Да (Совпадения допускаются). Ведь могут же попасться родственники или однофамильцы!
  3. "Имя". Тип поля текстовый, размер 25 символов. Индексированное поле - Да (Совпадения допускаются).
  4. "Отчество". Тип поля текстовый, размер 25 символов. Индексы не нужны.
  5. "Пол". Текстовый, размер 3 символа. В формате поля укажите "муж/жен", конечно, без кавычек.
  6. "Сем_Полож". Логический тип, формат поля "Да/Нет". Здесь мы будем указывать, состоит ли сотрудник (сотрудница) в браке.
  7. "Детей". Числовой тип, размер поля Байт (трудно представить, что у кого-то будет более 255 детей!).
  8. "Дата_Рожд". Тип поля - Дата/Время. Выберите формат "Краткая форма даты". Затем выберите тот же формат для поля "Маска". При попытке выбора маски выйдет запрос на подтверждение сохранения таблицы. Ответьте утвердительно, а вместо имени таблицы по умолчанию "Таблица 1" впишите " LichData ", так будет называться наша первая таблица. После этого появится окно создания маски ввода. Выберите "Краткий формат даты", нажмите "Далее", после чего в окне "Маска ввода" наберите "00.00.0000". В результате мы будем иметь маску в виде "дд.мм.гггг".
  9. "Дата_Пост". Все то же самое, что и в №8.
  10. "Стаж". Тип поля числовой, размер - байт.
  11. "Образование". Текстовый, размер поля 30 символов. Ведь здесь может быть и длинный текст, например "неоконченное высшее техническое".
  12. "Военнообязанный". Логический тип, формат "Да/Нет".

В результате получим такую картину.

Было упомянуто всего несколько слов о том, что в состав Провайдера
Данных (Data Provider) входит объект Соединение (Connection ).
В данной статье мы рассмотрим этот объект более подробно, выясним его роль в
ADO.NET, основные свойства и методы.
Назначение объекта Connection
поддерживать физическую связь между хранилищем данных и приложением.NET.
Поскольку, как мы уже знаем, в составе ADO.NET имеется два Провайдера Данных, а
каждый из них имеет собственную реализацию объекта Connection, нам придется
рассмотреть обе разновидности.

OLE DB .NET Data Provider включает в себя OleDbConnection
(пространство имен System.Data.OleDB ), а SQL Server .NET Data
Provider, соответственно, - SqlConnection (пространство имен
System.Data.SqlClient
). Хотя различия между ними не столь
радикальны, тем не менее, их следует иметь в виду при переносе приложений на
другое хранилище данных.

Как упоминалось ранее, SqlClient работает с
хранилищем данных напрямую, поэтому при работе с Microsoft SQL Server 7.0 и
выше предпочтительнее использовать SQL Server .NET Data Provider и SqlConnection ,
поскольку это обеспечит более высокую эффективность работы приложения.

Как создать соединение?

Те, кто работает в интерактивной среде разработки Visual
Studio .NET, наверное, уже привыкли к тому, что в ней имеется большой набор
«мастеров», которые облегчают труд программиста, выполняя за него
обременительную рутинную работу. Не является исключением и создание Connection .

Те, кто проповедует аскетизм.NET Framework (или вынужден
довольствоваться им поневоле), могут пропустить этот раздел и перейти к
следующему, в котором описывается программное создание Connection.

Создание Connection посредством Server Explorer

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

Попробуем создать Соединение при помощи Server Explorer. Для
этого сначала создадим проект приложения Windows. Затем убедимся, что панель
Server Explorer доступна (если нет, включить ее можно посредством меню View
->Server Explorer). Выглядит она примерно таким образом:


Такая же кнопка имеется в меню Tools:


После нажатия на кнопку появляется окно «Свойства связи с
данными», хорошо знакомое тем, кто уже имеет опыт работы в ADO:


Попробуем создать соединение с базой данных «Борей», которая
поставляется в качестве примера вместе с Microsoft Access различных версий и
наверняка присутствует на подавляющем большинстве компьютеров, на которых
установлен Microsoft Office. Для этого:


    переходим на страницу «Поставщик данных»;


    выбираем из списка «Поставщики OLE DB» строку «Microsoft Jet
    4.0 OLE DB Provider»


Примечание. Microsoft Jet – это ядро базы данных, которое
Microsoft использует как основу для Access, а также в составе ряда других
продуктов (например, для хранения электронной корреспонденции в Exchange
Server). С помощью провайдера Microsoft Jet 4.0 OLE DB Provider можно получить
доступ к данным, хранящимся в базах данных, созданных посредством Access.



  • жмем кнопку «Далее >>» или переходим на страницу
    «Подключение»;

нажав на кнопку с многоточием «…», выбираем полный путь к
файлу базы данных (или вводим вручную, если есть желание); у меня он выглядит
так: C:\Program Files\Microsoft Office\Office10\Samples\Борей.mdb;


если на вашей системе база данных «Борей» защищена паролем,
введите его в соответствующем поле; если вы желаете, чтобы пароль для доступа к
базе данных хранился месте с другими данными о соединении, установите опцию
«Разрешить сохранение пароля» (разумеется, это нежелательно, если содержимое
базы не должно быть открыть для несанкционированного доступа);


    для проверки работоспособности нажмите кнопку «Проверить
    подключение»; если все сделано правильно, вы увидите результат:



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


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


    если проверка подключения к базе данных прошла успешно,
    нажмите кнопку «OK» окна «Свойства связи с данными»;


    на панели Server Explorer появляется новое соединение с
    базой данных «Борей»:



Посредством Server Explorer мы можем не только исследовать
структуру таблиц, видов, хранимых процедур и прочих объектов базы данных, но и
получить доступ к их содержимому. Например, двойной щелчок левой кнопкой мыши
на значке таблицы открывает ее содержимое для просмотра и даже редактирования в
среде Visual Studio .NET.


    теперь осталось создать объект Connection, который позволит
    нашей программе установить соединение с базой данных «Борей»; для этого
    буксируем пиктограмму соединения с панели Server Explorer на форму нашего
    приложения.


На этом работа по созданию объекта Connection
завершена! Под формой приложения появился значок:


Это и есть объект типа System.Data.OleDb.OleDbConnection ,
который мы стремились получить. При необходимости имя объекта можно изменить
при помощи панели свойств.

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

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

Итак, подведем итог проделанной работе. В результате наших
действий на панели Server Explorer появилось соединение с базой данных «Борей»,
которое посредством буксировки мышью было помещено на форму нашего приложения.
Появилась соответствующая пиктограмма, при ее выборе мышью свойства объекта
Connection видны на панели свойств Проверка кода программыпоказывает, что среди
объектов формы появился новый
private System.Data.OleDb.OleDbConnection oleDbConnection1;
а в методе InitializeComponent появились строки:
this.oleDbConnection1 = new System.Data.OleDb.OleDbConnection();

// oleDbConnection1

This.oleDbConnection1.ConnectionString =

Source=C:\Program Files\Microsoft Office\Office10\Samples\Борей.mdb;Mode=Share
Deny None;Extended Properties="""";Jet OLEDB:System database="""";Jet
OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engine
Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk
Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database
Password="""";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt
Database=False;Jet OLEDB:Don"t Copy Locale on Compact=False;Jet OLEDB:Compact
Without Replica Repair=False;Jet OLEDB:SFP=False";
Мы видим, что помимо создания объекта OleDbConnection ,
его свойству ConnectionString присвоено значение в
виде довольно-таки длинной строки. Что означает сия конструкция, мы
разберем немного позже, а пока рассмотрим альтернативные способы создания
объекта Connection .

Примечание. Для полноты изложения стоит упомянуть, что помимо
панели Server Explorer, с Connection можно также работать и посредством ссылок
на базу даннах (Database References) из панели Solution Explorer Visual Studio
.NET. Однако подробно на этом останавливаться не будем, поскольку этот вопрос
скорее относится к работе IDE, а не к функциональности Connection ADO.NET.

Программное создание Connection

Разумеется, как и практически любой объект в Visual Studio
.NET, создаваемый посредством вызова «мастера», экземпляр объекта Connection
можно создать и программным путем. Особенно полезным такой способ является при
создании консольных приложений.NET, поскольку «мастер» создает экземпляр
Connection
при буксировании его на форму приложения, а отсутствие
самой формы делает такой подход непригодным.
Вряд ли для читателя будет неожиданностью, что для создания
Connection
нужно вызвать конструктор. Обе разновидности Connection
имеют два перегруженных варианта конструктора: с пустым списком параметров () и
с единственным параметром (ConnectionString ), который задает
строку подключения (и опять откладываем разъяснение, что же это такое).

Пример программного создания Connection :

Public SqlConnection cnnTest = new SqlConnection();
(разумеется, предполагается, что в программе предварительно
было объявлено, что используется пространство имен System.Data.SqlClient ).

Свойства Connection

Прежде всего во избежание возможных недоразумений замечу, что
при рассмотрении свойств, методов и событий я рассматриваю в первую очередь те,
которые являются собственными для данного класса (это относится к Connection
и будет относиться к классам, рассматриваемым в следующих статьях). Помимо них,
классы имеют свойства, методы и события, унаследованные от родительских
классов. Если унаследованные члены класса не имеют непосредственного отношения
к нашей основной тематике, а именно – работе с базами данных посредством
ADO.NET, я их рассматривать не буду, чтобы не загромождать статью
несущественными деталями. В то же время имейте в виду, что данные классы могут
иметь и другие члены, кроме упомянутых мной.

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

Название Описание Тип Доступ OLE DB SQL Значение по умолчанию
ConnectionString Строка соединения System.String RW + +
ConnectionTimeout Время ожидания соединения в секундах System.Int32 R + + 15 сек
Database Имя текущей базы данных (или той, которая будет использоваться при открытии соединения) System.String R + +
DataSource Имя сервера баз данных (SQL) или спецификация файла с данными System.String R + +
PacketSize Размер сетевого пакета в байтах System.Int32 R - + 8192
Provider Имя провайдера OLE DB System.String R + -
ServerVersion Версия сервера баз данных System.String R + +
State Битовая комбинация значений ConnectionState ConnectionState R + + Closed
WorkstationId Строка, идентифицирующая клиента System.String R - + Имя клиентского компьютера

Примечания:


    В графе «Доступ» RW обозначает запись и чтение, R – только
    чтение.


    В графах «OLE DB» и «SQL» указано наличие данного свойства
    для OleDbConnection и SqlConnection ,
    соответственно. «+» – свойство поддерживается, «-» – не поддерживается.


    В графе «Значение по умолчанию прочерк «–» для свойств типа
    System.String
    означает пустую строку.


    Перечислены только собственные свойства объекта, без учета
    свойств, наследуемых от Component.


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

Обратите внимание на небольшое различие в свойствах OleDbConnection
и SqlConnection . Хотя основной набор их одинаков, все же
некоторые специфичны для провайдера. SqlConnection имеет
уникальные свойства PacketSize и WorkstationId ,
а OleDbConnection – свойство Provider . Это
может негативно повлиять на переносимость программ на другую платформу.

Следует избегать задания свойству ConnectionTimeout
нулевого значения, т.к. оно соответствует бесконечному тайм-ауту и может
привести к зависанию приложения.

Значение свойства Database может изменяться в
ходе выполнения приложения, если оно меняет текущую базу данных (либо
соответствующим оператором SQL, либо вызовом метода ChangeDatabase ).

Значение свойства PacketSize может быть
задано в диапазоне от 512 до 32767 байт. При пересылке больших объемов данных
увеличение размера пакета может повысить производительность, т.к. уменьшает
количество небходимых операций чтения/записи пакетов.

Свойство State может принимать значения из
перечисления ConnectionState . Эти значения следующие:

В данное время из этого набора значений допустимыми являются только Open
и Closed .

Строка соединения (Connection String)

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

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

Строка соединения представляет собой текстовую строку
специального вида. Она состоит из пар вида «ключ=значение», разделенных
символом «точка с запятой» (;).

«Ключ» не зависит от регистра и может задаваться как на
верхнем, так и на нижнем регистрах; «значение» в общем случае зависит от
регистра.

Допустимо повторение «ключа» несколько раз в строке. В этом
случае используется последнее вхождение, остальные игнорируются. Ошибкой такое
повторение не является.

Содержимое строки специфично для конкретного провайдера.
Обычно для построения корректной строки во время проектирования программы
полезно бывает воспользоваться следующей уловкой: создать соединение при помощи
Server Explorer (мы уже умеем это), а затем скопировать строку соединения из
его свойств.

Значение свойства ConnectionString можно
задавать только при закрытом соединении ! После установки Connection
анализирует строку и устанавливает значения остальных свойств в соответствии с
ее содержимым. Впрочем, полный анализ содержимого строки соединения
производится только в момент открытия Connection . Если при
этом встретится неподдерживаемое имя ключа или недопустимое значение, будет
сгенерировано соответствующее исключение (OleDbException или
SqlDbException
).

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

Методы Connection

К счастью, методы SqlConnection и OleDbConnection
совершенно одинаковы.

Наиболее важными, пожалуй, являются Open и
Close
. Они могут вызываться как явно, так и неявно, другими
компонентами ADO.NET. Если метод Open вызывается компонентами
DataAdapter
или DataCommand (которые мы рассмотрим
в следующих статьях), то они оставляют Connection в начальном
состоянии, т.е. если Connection был открыт, то ничего не
меняется, а если закрыт – то вызывающий компонент открывает его, выполняет
требуемую операцию, а затем закрывает. Таким образом, программист может
игнорировать побочные эффекты этих компонентов.

Открытое соединение не закрывается автоматически при
уничтожении объекта Connection
! Необходимо помнить, что
открытое соединение потребляет ресурсы как рабочей станции, так и
сервера-источника данных. Поэтому следует взять за правило явно закрывать
соединение посредством вызова Close и делать это как можно
раньше, как только соединение больше не требуется. При закрытии соединения
Close
откатывает все незавершенные транзакции.

BeginTransaction – перегруженная функция,
возвращающая объект-транзакцию (различные для разных провайдеров). Думаю,
сейчас обсуждать вопрос реализации транзакций преждевременно, поскольку в
теоретическом курсе мы еще не рассмотрели, что это такое.

CreateCommand создает объект Datacommand ,
который мы еще не рассматривали. Поэтому нам придется пока довольствоваться
этим скудным описанием. Смысл данной операции станет ясен позже.

Пул соединений

Для более экономного использования ресурсов ADO.NET работает с
пулом соединений. SQL Server .NET Data Provider имеет собственный пул
соединений, а OLE DB .NET Data Provider использует пул OLE DB. Управлять пулом
можно соответствующими параметрами строки соединения, но подробное рассмотрение
этого вопроса выходит за рамки статьи.

Для начала достаточно знать, что пул соединений – это некое
хранилище готовых к употреблению соединений. По умолчанию пул соединений
разрешен, и при закрытии соединения через Close оно на самом
деле не закрывается физически, а помещается в пул. Если при попытке открыть
новое соединение через Open обнаруживается, что такое готовое
соединение есть в пуле, оно не создается, а просто выдается приложению из пула.
Поскольку на установление соединения требуется время, которое для удаленного
сервера может оказаться весьма ощутимым, использование пула может существенно
ускорить работу приложения.

Механизм работы с пулом соединений совершенно прозрачен для
программиста, и запрещение пула или явное управление его параметрами через
строку соединения вряд ли потребуется для повседневной работы.

События connection

Эти события немногочисленны, их всего два, и они совпадают для
обоих вариантов Connection .

StateChange возникает при изменении состояния
Connection, т.е. когда его свойство State меняет значение с
Open
на Closed или наоборот. Обработчик этого
события получает аргумент типа StateChangeEventArgs , который
имеет два свойства: OriginalState (исходное состояние
соединения) и CurrentState (его текущее состояние). Оба эти
свойства могут принимать одно из значений перечисления ConnectionState ,
которое мы уже рассмотрели ранее при изучении свойства State .

InfoMessage возникает, когда источник данных
возвращает предупреждение или информационное сообщение. Оба варианта соединения
возвращают коллекцию ошибок, текстовое описание ошибки и имя объекта, в котором
возникла ошибка. OleDbConnection.InfoMessage имеет
дополнительное свойство ErrorCode , которое идентифицирует
источник ошибки в соответствии со стандартом ANSI SQL.

Итоги

Итак, подведем итог, чему мы научились в этой статье.

Прежде всего – весьма, на мой взгляд, важный факт, про который
не следует забывать. Имеется две реализации Connection – для
OLE DB и MS SQL Server. Эти реализации довольно похожи, но не идентичны.
Поэтому на начальном этапе разработки следует определиться, чем пожертвовать –
эффективностью или переносимостью, так как в дальнейшем может потребоваться
переделка программы.

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

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

Основное свойство Connection – это ConnectionString ,
именно в нем задаются все параметры, необходимые для установления соединения.
Все остальные свойства, кроме State , являются производными и
возвращают значения отдельных параметров соединения, но изменять их можно
только через ConnectionString.

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

Любые изменения параметров соединения можно производить только
тогда, когда оно закрыто. Исключением является текущая база данных, которую
можно изменить при открытом соединении вызовом метода ChangeDatabase .

При изменении состояния соединения возникает событие StateChange ,
а при получении предупреждения или информационного сообщения – событие InfoMessage .

Заключение

И наконец в закрепление знаний, полученных нами о соединениях ADO.NET, приведу
небольшую программу, которая способна открывать и закрывать соединения с
учебной базой данных (кнопки "Open"
и
"Close" ), а также показывать состояние и свойства соединения
(кнопка "Show" ). Программа может быть откомпилирована и выполнена в среде
Visual Studio .NET или.NET Framework.

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


    Попытка открыть уже открытое соединение приводит к ошибке. Поэтому при открытии
    соединения в сомнительных случаях либо проверяйте его состояние (свойство
    State
    ), либо перехватывайте исключение InvalidOperationException .
    К закрытию закрытого соединения ADO.NET относится гораздо лояльнее и ошибки
    времени выполнения не возникает.


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


Код программы-примера для этой статьи:

Using System;

Using System.Windows.Forms;

Using System.Data;

Namespace ConnSample

{
public class frmConnSample: System.Windows.Forms.Form

{
private System.Windows.Forms.Button btnExit;
private System.Windows.Forms.Button btnOpen;
private System.Windows.Forms.Button btnClose;
private System.Windows.Forms.Label lblConnState;
private System.Windows.Forms.TextBox txtConnstate;
private System.Data.OleDb.OleDbConnection oleDbCnn1;
private System.Windows.Forms.Button btnShow;
private System.Windows.Forms.ListBox lstConnProps;
private System.ComponentModel.Container components = null;

Public frmConnSample()
{
InitializeComponent();
}

Protected override void Dispose(bool disposing
{
if(disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}

#region Windows Form Designer generated code
private void InitializeComponent()
{
this.btnExit = new

this.oleDbCnn1 = new
System.Data.OleDb.OleDbConnection();
this.btnOpen = new
System.Windows.Forms.Button();
this.btnClose = new
System.Windows.Forms.Button();
this.lblConnState = new
System.Windows.Forms.Label();
this.txtConnstate = new
System.Windows.Forms.TextBox();
this.btnShow = new
System.Windows.Forms.Button();
this.lstConnProps = new
System.Windows.Forms.ListBox();
this.SuspendLayout();
// btnExit
this.btnExit.Location = new
System.Drawing.Point(296, 232);
this.btnExit.Name = "btnExit";
this.btnExit.TabIndex = 0;
this.btnExit.Text = "Exit";
this.btnExit.Click += new
System.EventHandler(this.btnExit_Click);
// oleDbCnn1
// строка подключения; подкорректируйте ее
согласно размещению файлов на вашем компьютере
this.oleDbCnn1.ConnectionString =
@"Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data
Source=C:\Program Files\Microsoft Office\Office10\Samples\Борей.mdb";
// добавляем обработчик события StateChange
this.oleDbCnn1.StateChange += new
System.Data.StateChangeEventHandler(this.ShowConnState);
// btnOpen
this.btnOpen.Location = new
System.Drawing.Point(16, 232);
this.btnOpen.Name = "btnOpen";
this.btnOpen.TabIndex = 2;
this.btnOpen.Text = "Open";
this.btnOpen.Click += new
System.EventHandler(this.btnOpen_Click);
// btnClose
this.btnClose.Location = new
System.Drawing.Point(104, 232);
this.btnClose.Name = "btnClose";
this.btnClose.TabIndex = 3;
this.btnClose.Text = "Close";
this.btnClose.Click += new
System.EventHandler(this.btnClose_Click);
// lblConnState
this.lblConnState.Location = new
System.Drawing.Point(16, 200);
this.lblConnState.Name = "lblConnState";
this.lblConnState.Size = new
System.Drawing.Size(96, 16);
this.lblConnState.TabIndex = 4;
this.lblConnState.Text = "Connection state:";
// txtConnstate
this.txtConnstate.Location = new
System.Drawing.Point(112, 200);
this.txtConnstate.Name = "txtConnstate";
this.txtConnstate.TabIndex = 5;
this.txtConnstate.Text = "";
// btnShow
this.btnShow.Location = new
System.Drawing.Point(296, 200);
this.btnShow.Name = "btnShow";
this.btnShow.TabIndex = 6;
this.btnShow.Text = "Show";
this.btnShow.Click += new
System.EventHandler(this.btnShow_Click);
// lstConnProps
this.lstConnProps.Location = new
System.Drawing.Point(16, 16);
this.lstConnProps.Name = "lstConnProps";
this.lstConnProps.Size = new
System.Drawing.Size(344, 173);
this.lstConnProps.TabIndex = 7;
// frmConnSample
this.AutoScaleBaseSize = new
System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(384,
266);
this.Controls.AddRange(new
System.Windows.Forms.Control

{
this.lstConnProps,
this.btnShow,
this.txtConnstate,
this.lblConnState,
this.btnClose,
this.btnOpen,
this.btnExit
});
this.FormBorderStyle =
System.Windows.Forms.FormBorderStyle.Fixed3D;
this.MaximizeBox = false; this.MinimizeBox =
false; this.Name = "frmConnSample";
this.Text = "Connection Sample";
this.ResumeLayout(false);
}
#endregion


static void Main()
{
Application.Run(new frmConnSample());
}

Private void btnExit_Click(object sender, System.EventArgs
e)
{
Application.Exit();
}

Private void btnOpen_Click(object sender, System.EventArgs
e)
{
try
{
oleDbCnn1.Open();
}
catch (InvalidOperationException err) // попытка
открыть уже открытое соединение
{
MessageBox.Show("Connection is
already open!!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (System.Data.OleDb.OleDbException err)
{
MessageBox.Show("Error opening
Connection!!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

Private void btnClose_Click(object sender, System.EventArgs
e)
{
oleDbCnn1.Close();
}

Private void btnShow_Click(object sender, System.EventArgs
e)
{
try
{
lstConnProps.Items.Clear();

LstConnProps.Items.Add("ConnectionString = " + oleDbCnn1.ConnectionString);

LstConnProps.Items.Add("ConnectionTimeout = " +
oleDbCnn1.ConnectionTimeout.ToString());
lstConnProps.Items.Add("Database = "
+ oleDbCnn1.Database);
lstConnProps.Items.Add("DataSource =
" + oleDbCnn1.DataSource);
lstConnProps.Items.Add("Provider = "
+ oleDbCnn1.Provider);

LstConnProps.Items.Add("ServerVersion = " + oleDbCnn1.ServerVersion);
lstConnProps.Items.Add("State = " +
oleDbCnn1.State);
}
catch (System.InvalidOperationException err)
{
MessageBox.Show("Cannot get some
properties of the closed Connection!!!", "Warning", MessageBoxButtons.OK,
MessageBoxIcon.Warning);
}
}

// индикатор текущего состояния соединения
private void ShowConnState(object sender,
StateChangeEventArgs e)
{
txtConnstate.Text = oleDbCnn1.State.ToString();
}
}
}

5. 5 Технология доступа к данным ADO

Технология доступа к данным ADO

Основные особенности технологии доступа к данным ADO

Технологии ODBC и OLE DB считаются хорошими интерфейсами передачи данных, но как программные интерфейсы имеют много ограничений, т.к. являются низкоуровневыми.

Для снятия этих ограничений была предложена технология ADO (Delphi 5).

Технология ADO представляет иерархическую модель объектов для доступа к различным OLE DB-провайдерам данных. Объектная модель ADO включает объекты, обеспечивающие соединение с провайдером данных, создание SQL-запросов к данным и т.д.

Модель объекта не содержит таблиц, среды. Здесь основными объектами являются:

    объект Набор данных;

    объект Соединение, создающий связь с провайдером данных;

    объект Команда –выполнение процедуры.

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

Технология ADO и интерфейсы OLE DB обеспечивают для приложений единый способ доступа к источникам данных различных типов (рис.1).

Рис. 1. Схема доступа к данным через ADO

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

Компоненты ADO

Эта технология аналогична BDE по назначению и довольно близка по возможностям. Используемые компоненты для доступа к данным также довольно похожи на соответствующие компоненты BDE. Поэтому, не вдаваясь в подробности, рассмотрим только особенности компонентов ADO при работе с локальными базами данных. Главное отличие состоит в процедуре настройки связи с таблицей базы данных.

Все использующие ADO компоненты доступа к данным размещены на странице ADO палитры компонентов (рис.2).

Рис. 2. Компоненты ADO

TADOConnection аналогичен компоненту BDE TDatabase и используется для указания базы данных и работы транзакциями. С одним компонентом TADOConnection может быть связанно несколько компонентов TADOTable и TADOQuery.

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

TADOQuery позволяет выполнять SQL-запросы при работе с данны­ми через ADO. Соединение с хранилищем данных осуществляется стандарт­ным методом. Текст запроса содержится в свойстве SQL.

TADOStoredProc позволяет обращаться к хранимым процедурам, содержащимся в базах данных. Имя хранимой процедуры определяется свойством ProcedureName.

TADODataSet предназначен для представления набора данных из хранилища ADO.

TADOCommand и TADODataSet являются наиболее общими компонентами для работы с ADO, но и наиболее сложными в работе. Оба компонента позволяют выполнять команды на языке провайдера данных (так в ADO называется драйвер базы данных).

Установление связи с объектом ADO

В ADO компонентах для доступа к БД используется, так называемая строка подключения ConnectionString: WideString. В строке подключения указываются параметры подключения к БД такие как местоположение и имя БД, провайдеры, пароли необходимые для подключения и т.д. Запомнить состав строки и ее синтаксис довольно сложно, поэтому для ее настройки используется специальный мастер.

Первый шаг задания свойства ConnectionString, это выбор способа определения подключения. База данных может быть указана двумя способами: через файл формата Microsoft Data Link (расширение UDL) либо прямым заданием параметров соединения (рис. 3).

Рис. 3. Выбор способа определения строки подключения

При прямом задании соединения значение свойства ConnectionString может быть задано напрямую в поле ввода окна диалога ConnectionString. Однако обычно проще использовать специальный мастер, вызываемый щелчком на кнопке с многоточием в конце поля ввода. При этом открывается окно диалога Data Link Properties, в котором выбираются тип базы данных, ее местоположение и параметры соединения (см. рисунок 4). Данное окно диалога содержит четыре вкладки:

    на вкладке Provider (Поставщик данных) выбирается тип БД. Базы данных Microsoft Access доступны через драйверы Microsoft Jet OLE DB Provider и Microsoft OLE DB Provider for ODBC. Базы данных dBase, Paradox и FoxPro доступны только через ODBC;

Рис. 4. Диалоговое окно настройки параметров соединения: выбор провайдера

    состав элементов управления вкладки Connection (Подключение) зависит от выбранного типа БД (рис. 5). Рассмотрим вариант выбора соединений Microsoft Jet 4.0 OLE DB Provider:

    флажок Blank password подавляет отображение окна диалога для ввода идентификатора и пароля пользователя при установлении соединения, если поле пароля пустое;

    флажок Allow saving password сохраняет пароль в строке параметров соединения. Если флажок не установлен, то введенный пароль будет использоваться только при выполнении тестового соединения;

    кнопка Test Connection позволяет проверить правильность и полноту параметров;

    переключатель Use data source name позволяет ввести предустановленный псевдоним ODBC, а в положении Use connection string вводится как псевдоним, так и тип ODBC драйвера и параметры соединения;

    путь к базе данных задается в поле ввода Select or enter a database name для соединения Microsoft Jet OLE DB Provider или в поле ввода Use data Source name для соединения Microsoft OLE DB Provider for ODBC. Причем в первом случае при щелчке на кнопке с многоточием, расположенной справа от поля ввода, появится окно диалога открытия файла, с помощью которого выбирается необходимый файл базы данных. Во втором случае путь к базе данных приходится вводить вручную;

Рис. 5 – Окно диалога DataLinkProperties(вкладка Подключение)

    на вкладке Advanced (Дополнительно) (рис.6) расположены дополнительные параметры, с помощью которых устанавливаются уровень доступа к файлу базы данных, время ожидания сетевого соединения (то есть время, через которое связь будет считаться потерянной, если сервер не отвечает) и уровень защиты соединения;

Рис. 6 – Окно диалога DataLinkProperties(вкладка Дополнительно)

    на вкладке All (Все) (рис. 7) можно отредактировать все параметры с предыдущих страниц и параметры, зависящие от выбранного соединения, не помещенные на вкладку Connection. Редактирование осуществляется путем ввода значений параметров в текстовой форме. Описание этих параметров можно найти в следующих документах: MSDN Data Access Services, Microsoft Data Access Components (MDAC) SDK, Microsoft ActiveX Data Objects (ADO), Microsoft ADO Programmers Reference, Using Providers with ADO.

Рис. 7 – Окно диалога DataLinkProperties(вкладка Все)

В остальном, работа с компонентом ADOTable и ADOQuery практически ничем не отличается от работы аналогичных компонентов использующих механизм доступа BDE.