Использование библиотеки ADO (Microsoft ActiveX Data Object). Технология ADO

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.

Владея основами работы с ADO, можно переходить к написанию программ для работы с ADO в приложениях. Мы снова воспользуемся средствами ADO для подключения к базе данных Biblio.mdb, но и этого будет вполне достаточно для демонстрации общих принципов. Начнем со следующего примера и затем перейдем к программированию:

1. Создайте новый проект командой File > New Project. Выберите в диалоговом окне New Project значок Standard EXE и нажмите кнопку ОК.

2. Задайте свойству Name проекта значение ADORecordset.

3. Задайте свойству Name формы Form1 значение frmMain, а свойству Caption - зна-чениеРабота с наборами записей ADO.

4. Создайте список на форме frmMain и задайте его свойству Name значение 1st Authors.

Как упоминалось ранее, элемент данных ADO является элементом ActiveX. Его можно перетащить на форму, как и любой другой элемент. Объекты подключения и набора записей являются DLL-библиотеками (библиотеками динамической компоновки) Active, и доступ к ним осуществляется только с помощью ссылки на библиотеку типов.

ПРИМЕЧАНИЕ Библиотека типов содержит полное описание компонента: свойства, методы, события и типы данных.

5. Выполните в Visual Basic команду Project > References, чтобы открыть диалоговое окно References.

8. Добавьте следующие объявления в секцию (General)(Declarations) формы:

Private cn As ADODB.Connection

Private rs As ADODB.Recordset

9. Вставьте следующий фрагмент в процедуру события Form_Load:

Private Sub Form_Load()

Dim cmd As String

Dim sql As String

Dim cn As ADODB.Connection

Dim rs As ADODB.Recordset

"Создать строку подключения

cmd = "Provider=microsoft.jet.OLEDB.3.51"" & _

"Data Source=" & _

"C:\Program Files\Microsoft Visual Studio" & _

"\VB98\Biblio.mdb"

"Установить соединение с базой данных

Set cn = New ADODB.Connection

ConnectionString = cmd

" Создать запрос

sql = "select * from authors"

" Открыть набор записей

Set rs.= New ADODB.Recordset

Do While Not rs.EOF


" Перейти к следующей записи

" Закрыть набор записей.

Set rs = Nothing

" Закрыть подключение

"уничтожить объект подключения

Set cn = Nothing

10.Сохраните и запустите проект.

Программа просто обращается к базе данных Biblio.mdb и заполняет список именами авторов из таблицы Authors. Наверное, вам покажется, что для такой простой задачи программа получилась слишком большой, но если как следует разобраться, вы поймете, что в ней нет ничего сложного.

В начале программы объявляются две переменные, cmd и sql. В переменной cmd, будет храниться строка подключения ADO, используемая для подключения к базе данных. Переменная sql предназначена для текста SQL-запроса. Следующий фрагмент создает строку для подключения к Biblio.mdb c помощью нового провайдера OLEDB (указывается после конструкции Provider = в начале строки).Если вам потребуется подключиться к источнику данных другого типа, допустим, к SQL Server - укажите другого провайдера. Второй параметр стро ки определяет имя базы данных. Строка подключения ADO выполняет всю основную работу, поэтому ей следует уделить основное внимание. Выделение этого кода в отдельную функцию позволяет создавать различные строки подключения для работы с различными базами данных (например, Access, SQL Server и Oracle). Такой функции можно передавать параметр, по которому строится уникальная строка подключения. Это упростит процесс перенесения ваших приложений с поддержкой ADO на другие источники данных.

Следующий шаг - фактическое подключение к базе данных. Для этого мы создаем объект ADO.Connection и затем устанавливаем его свойство ConnectionString равным cmd. После этого выполняется метод. Open данного объекта. Метод берет данные, находящиеся в свойстве ConnectionString, и использует их для подключения к базе.

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

sql = "select * from authors"

Не вдаваясь в подробности SQL, этот запрос означает следующее: «выбрать все (*) записи из таблицы с именем Authors». Именно это и было сделано в нашем примере.

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

Set rs = New ADODB.Recordset

Только что созданный набор не содержит никакой информации. В блоке With мы приказываем ADO открыть набор командой

Open sql, cn, adOpenForwardOnly, adLockReadOnly

Вероятно, вы обратили внимание на параметры, необходимые для открытия набора записей. В первом параметре хранится SQL-запрос для данного набора. Второй параметр, cn, говорит о том, что для подключения к базе данных набор должен использовать объект подключения cn. Можно провести аналогию между набором записей и машиной: подключение - дорога, по которой машина добирается к данным. Следующий параметр сообщает ADO, какой тип курсора базы данных должен использоваться для набора. В следующей таблице перечислены возможные варианты курсоров с краткими описаниями.

Тип курсора Описание
adOpenForwardOnly Курсор этого типа может использоваться лишь для последовательного перебора записей в одном направлении. Перебор в обратном направлении и произвольные переходы не разрешаются. Тем не менее этот вариант отличается быстротой и пригодится в случае, если вам потребовалось быстро заполнить список или комбинированное поле
Ad0penKeyset Оптимальный тип курсора для больших наборов. Вы не получаете сообщений об изменениях в данных, которые могут повлиять на ваш набор записей
Ad0penDynamic Курсор позволяет отслеживать все изменения, вносимые другими пользователями в ваш набор записей. Он обладает наибольшими возможностями, но из-за этого работает медленнее всех остальных
AdOpenStatic Статический курсор удобен для небольших наборов

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

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

В следующем фрагменте программа в цикле перебирает все записи до тех пор, пока не будет найден признак конца файла (EOF). При перемещении курсора к очередной записи мы заносим данные из поля Author в список:

lstAuthors.AddItem rs("Author")

После занесения очередного имени в список мы переходим к следующей записи с помощью метода. MoveNext. Если позабыть об этом, цикл будет работать вечно, потому что признак конца файла никогда не будет достигнут. Наконец, после окончания работы все открытое нужно закрыть, а все созданное - уничтожить. Для этого следует вызвать метод.Close для объектов Recordset и Connection. Далее этим объектам присваивается Nothing для предотвращения утечек памяти в вашем приложении.

ВНИМАНИЕ Обрабатывая записи набора в цикле, обязательно включайте в него метод. MoveNext. Если вы забудете это сделать (а это случается часто), ваша программа зациклится. Запишите оператор Do While..., a потом - команду.MoveNext сразу же перед командой Loop, а уже потом вставляйте свой код обработки данных. Тем самым вы сводите вероятность ошибки к минимуму.

Добавление записей

Хотя в данном примере такая возможность не требовалась, в большинстве приложений в наборы добавляются новые записи. С объектами наборов записей ADO эта задача выполняется чрезвычайно просто. Для этого в программе следует вы-зватьметод.AddNew:

rs("Author) = "Doe, John" rs("Au_ID") = 123456

Все очень просто. Когда вам требуется создать новую запись, вы вызываете метод.AddNew. Он создает пустую запись, в которую затем заносятся данные. Это можно сделать несколькими способами, включая следующие:

Rs("Author") = "Doe, John"

Rs!Author = "Doe, John"

Rs.Fields(1) = "Doe, John"

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

После занесения данных в запись следует обновить набор, вызвав метод. Update.

Обновление записей

Процесс обновления записей напоминает процесс добавления, однако на этот раз вам не придется вызывать метод.AddNew. Достаточно переместить курсор базы данных к нужной записи, изменить данные и вызвать метод. Update. Например:

Rs("Author") = "Brown, Steve"

Rs("Au_ID") = 373737

ПРИМЕЧАНИЕ Если вам приходилось работать с объектами DAO, возможно, вы привыкли вызывать метод. Edit для перехода к редактированию данных. Он не поддерживается объектами ADO.

Удаление записей

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

"Создать запрос

sql = "select *from authors where = "Brown, Steve""

" Открыть набор записей

Set rs = New ADODB.Recordset

Open sql, cn, adOpenForwardOnly, adLockReadOnly

If rs.RecordCount > 0 Then

" Закрыть набор записей

" Уничтожить объект набора записей

Set rs = Nothing

ПОДСКАЗКА Переходите на использование ADO, поскольку Microsoft развивает свои технологии работы с данными именно в этом направлении. Вы не только будете работать с последними технологическими новинками, но и сможете переносить свои приложения на другие источники данных с минимальными изменениями кода (или вообще без изменений).Более того, ADO даже позволяет организовать обмен данными между базой и Web-страницей!

Теперь вы умеете создавать базы данных Access и работать с ними различными способами. Навыки, описанные в этом уроке, помогут вам работать с базами данных в будущих приложениях. Хотя возможности новой версии Visual Data Manager заметно возросли, все же я рекомендовал бы приобрести Microsoft Access, если вы не сделали этого раньше. Access обладает многими возможностями, упрощающими создание базы данных даже по сравнению с описанным выше несложным процессом. А самое приятное - ваши базы данных останутся совместимыми с Visual Basic!

Научившись работать с файлами и базами данных, вы сможете взять данные из своего приложения и сохранить их для последующей загрузки или печати, а также воспользоваться ими для сохранения и выборки рабочих параметров приложения. Не жалейте времени на эксперименты с Visual Data Manager. Он обладает многими возможностями, не упоминавшимися в этом уроке (полное описание потребовало бы отдельной книги). Объединяя возможности Visual Basic по программированию и работе с базами данных, вы сможете создавать достаточно мощные приложения. Следующий урок посвящен третьему важному аспекту любого приложения - печати.

Errors

Объект ADO.Connection, подключение к базе данных из VBScript, свойство ConnectionString, генерация строки подключения OLE DB при помощи файла UDL, обработка ошибок при подключении к базе данных, коллекция Errors

Создание объекта Connection производится очень просто. Например, чтобы подключиться к базе данных Northwind на сервере SQL Server с именем LONDON , можно использовать код вида

Dim cn

cn.Provider = "SQLOLEDB"

& "Initial Catalog = Northwind "

cn .Open

В принципе, этого вполне достаточно, чтобы создать работающий объект соединения (чтобы в этом убедиться, можно, например, выполнить команду Wscript .Echo cn .State до и после открытия). Однако есть смысл подробнее поговорить про различные свойства и методы этого объекта.

· свойство Provider определяет драйвер, который будет использован для подключения к базе данных. Обычно используются два типа драйверов для подключения - драйверы OLE DB и ODBC . Если есть возможность, необходимо использовать подключение по OLE DB - более современный способ, который работает намного быстрее. Свойство Provider необходимо указывать только при подключении по OLE DB , при подключении по ODBC все необходимые параметры передаются при помощи свойства ConnectionString . Значения свойств Provider для подключения к разным источникам данных могут выглядеть так:

o "Microsoft .Jet .OLEDB .4.0" - для подключений к файлам Access и Excel и другим источникам данных на основе Jet ;

o "SQLOLEDB " - для подключений к SQL Server (как в примере)

o "MSDAORA .1" - для подключений к серверу Oracle ;

o "ADsDSOObject " - для подключения к базе данных службы каталогов Windows .

· свойство ConnectionString - главное свойство объекта Connection . Оно определяет параметры подключения к источнику (его значение представляет из себя набор параметров, разделенных разделителем - точкой с запятой, порядок их значения не имеет). В нашем примере мы передали четыре значения параметра - User ID - идентификатор пользователя (это значит, что мы используем подключение SQL Server ), Password - пароль password и Data Source - имя сервера баз данных, Initial Catalog - имя базы данных на этом сервере. Для передачи ConnectionString можно использовать и метод Open . Если бы использовали подключение Windows к SQL Server , код для подключения мог бы выглядеть так:

Dim cn

Set cn = CreateObject("ADODB.Connection")

cn.Open "Provider=SQLOLEDB;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Northwind;Data Source=london1"

При подключении к файлу Access или Excel строка подключения могла бы выглядеть так:

cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Борей.mdb"

Проще всего создать строку соединения при помощи файла UDL . Для этого нужно создать обычный текстовый файл, переименовать его так, чтобы его расширение выглядело как.udl (от user data link ), щелкнуть два раза мышью и настроить параметры подключения. Потом можно открыть этот файл в блокноте и скопировать сгенерированную строку. Можно использовать в connection string и просто ссылку на созданный файл UDL :

cn.ConnectionString = "File Name = d:\mylink.udl"

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

Для подключения по ODBC рекомендуется вначале создать источник данных ODBC (через Панель управления -> Источники данных (ODBC ), а затем точно так же сгенерировать строку подключения при помощи файла UDL , выбрав драйвер Microsoft OLE DB Provider for ODBC Drivers .

· метод Open позволяет открыть соединение с базой данных (и проверить его работоспособность). В качестве параметра может принимать строку подключения, имя пользователя и пароль.

· метод Close позволяет закрыть соединение (объект соединения при этом из памяти не удаляется). Чтобы полностью избавиться от этого объекта, можно использовать код

cn.Close

Set cn = Nothing

или просто Set cn = Nothing - разрыв соединения произойдет автоматически.

Для этого объекта предусмотрено множество других свойств и методов, однако здесь они рассматриваться не будут (за дополнительной информацией можно обратиться к документации или учебным курсам Microsoft ). Единственное свойство, которое обязательно необходимо рассмотреть - это свойство Errors , которое возвращает коллекцию объектов Error - ошибок. Ошибки при установке или работе соединения встречаются очень часто (неверно введен пароль или имя пользователя, у пользователя недостаточно прав на подключение, невозможно обратиться к компьютеру по сети и т.п.), поэтому настоятельно рекомендуется реализовывать в программе обработку ошибок. Самый простой вариант реализации обработчика ошибок может выглядеть так:

Dim cn

Set cn = CreateObject("ADODB.Connection")

cn.Provider = "SQLOLEDB"

cn.ConnectionString = "User ID=SA;Password=password;Data Source = LONDON1;" _

& "Initial Catalog = Northwind"

On Error GoTo CnErrorHandler

cn.Open

Exit Sub

CnErrorHandler:

For Each ADOErr In cn.Errors

Debug.Print ADOErr.Number

Debug.Print ADOErr.Description

Next

End Sub

На практике перехватываются ошибки, характерные для данного подключения (нет файла Access , ошибка пароля или имени пользователя при подключении к SQL Server , нет прав, файл открыт в исключительном режиме и т.п.). и пользователю предлагается исправить ошибку.

Самые важные свойства объекта ADOError :

· Description - описание ошибки. Обычно наиболее важная информация содержится именно в описании.

· Number - номер ошибки. По номеру удобно производить поиск в базе знаний и в Интернет.

· Source - источник ошибки. Эта информация полезна только в том случае, если в коллекции Errors могут оказаться ошибки из разных источников.

· SQLState и NativeError - информация о возникшей ошибке, которая пришла с SQL -совместимого источника данных.

Последнее обновление: 31.10.2015

Чтобы подключаться к базе данных, нам необходимо создать и использовать объект SqlConnection:

Using System; using System.Data.SqlClient; namespace AdoNetConsoleApp { class Program { static void Main(string args) { string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True"; // Создание подключения SqlConnection connection = new SqlConnection(connectionString); try { // Открываем подключение connection.Open(); Console.WriteLine("Подключение открыто"); } catch (SqlException ex) { Console.WriteLine(ex.Message); } finally { // закрываем подключение connection.Close(); Console.WriteLine("Подключение закрыто..."); } Console.Read(); } } }

В конструктор объекту SqlConnection передается строка подключения, которая инициализирует объект. Чтобы использовать этот объект и подключаться к базе данных, мы должны выполнить его метод Open() , а после завершения работы с базой данных нам надо вызвать метод Close() для закрытия подключения. В случае возникновения ошибок закрытие подключения происходит в блоке finally.

В качестве альтернативного метода можно использовать конструкцию using, которая автоматически закрывает подключение:

Static void Main(string args) { string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True"; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); Console.WriteLine("Подключение открыто"); } Console.WriteLine("Подключение закрыто..."); Console.Read(); }

Асинхронное подключение

Для создания асинхронного подключения необходимо использовать асинхронный метод OpenAsync() :

Class Program { static void Main(string args) { ConnectWithDB().GetAwaiter(); } private static async Task ConnectWithDB() { string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True"; using (SqlConnection connection = new SqlConnection(connectionString)) { await connection.OpenAsync(); Console.WriteLine("Подключение открыто"); } Console.WriteLine("Подключение закрыто..."); } }

Получение информации о подключении

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

String connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True"; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); Console.WriteLine("Подключение открыто"); // Вывод информации о подключении Console.WriteLine("Свойства подключения:"); Console.WriteLine("\tСтрока подключения: {0}", connection.ConnectionString); Console.WriteLine("\tБаза данных: {0}", connection.Database); Console.WriteLine("\tСервер: {0}", connection.DataSource); Console.WriteLine("\tВерсия сервера: {0}", connection.ServerVersion); Console.WriteLine("\tСостояние: {0}", connection.State); Console.WriteLine("\tWorkstationld: {0}", connection.WorkstationId); } Console.WriteLine("Подключение закрыто...");

Консольный вывод в моем случае:

Возможные ошибки и их решение

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

Unhandled Exception: System.ArgumentException: Keyword not supported...

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

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

Cannot open database "название базы данных" requested by the login. The login failed. Login failed for user "название_пользователя"

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

И еще одна часто встречающаяся ошибка:

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible...

В этом случае, как правило, SQL Server не запущен. И его надо запустить или перезапустить, через панель служб.

Также может быть, что в строке подключения указано неправильное имя сервера, либо MS SQL Server вообще не установлен.

Было упомянуто всего несколько слов о том, что в состав Провайдера
Данных (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();
}
}
}