|
Введение Компоненты dbGo Создание подключения TADOConnection Компонент TADOTable Компонент TADODataSet Передача изменений в БД - технология обновляемых множеств Клиентские и серверные курсоры Какой провайдер выбрать? Компонент TADOQuery SQL-запросы с параметрами Компонент TADOStoredProc Компонент TADOCommand Транзакции Полезные ссылки Скачать примеры к статье: Firebird,Interbase и Delphi Скачать IBProvider Professional Edition |
||
Введение. Доступ к Interbase и Firebird из DelphiВ Delphi cуществует несколько способов работы с Interbase и Firebird. Мне известны, как минимум, 3 способа организации доступа к данным через IBProvider:
Компоненты dbGodbGo - это VCL-компоненты от Borland, позволяющие работать с библиотекой ADO из Delphi и C++ Builder привычным для этих средств разработки способом. До Delphi 6 компоненты назывались ADOExpress. Внешний вид панели компонентов dbGo в Delphi (RAD Studio 2007):
Состав dbGo-компонентов:
Создание подключения TADOConnectionКомпонент TADOConnection осуществляет соединение с хранилищем данных. TADOConnection похож на компонент TSQLConnection. Разница между ними в том, что при работе с TSQLConnection параметры соединения устанавливались с помощью свойств ConnectionName, DriverName и Params. В TADOConnection все параметры подключения задаются через свойство ConnectionString. Кроме того в качестве строки подключения в TADOConnection может быть указано имя файла с параметрами подключения. Для хранения параметров подключения в Windows существует специальный тип файлов Microsoft Data Link - это файл с расширением udl. С этим расширением ассоциирован универсальный редактор подключений. IBProvider поддерживает свои собственные табы, которые предоставляют удобный интерфейс для формирования параметров соединения. Для того чтобы использовать udl файл в своем приложении выполните следующие шаги:
![]()
![]()
Теперь добавьте на форму компонент TADOConnection. Задайте свойство: Login Promt=false и установите в качестве строки подключения ConnectionString созданный ранеее файл подключения udl: ![]() Подробная информация о свойствах инициализации IBProvider. Отображение данных через TADOTableКомпонент TADOTable позволяет загружать данные одной таблицы.
В результате DBGrid отобразит данных той таблицы, которая была выбрана в объекте TADOTable: ![]() Компонент TADODataSetКомпонент TADODataSet - это надстройка над объектом ADODB.Recordset. В отличии от TADOTable, TADODataSet может загружать не только таблицы, но и множества, возвращаемые хранимыми процедурами или SQL-запросами. Перед началом работы с TADODataSet установите свойство Connection = ADOConnection1. Альтернативный вариант - эта указать строку подключения в свойстве ConnectionString. Но я настоятельно рекомендую для хранения подключения использовать отдельный объект TADOConnection. В свойстве CommandText укажите текст команды для загрузки данных. Текстом команды могут являться:
Команда в CommandText должна возвращать набор данных. К примеру, в тексте нельзя использовать INSERT, DELETE или UPDATE, а так же указывать хранимые процедуры, которые не возвращают набор данных (Recordset). Перейдем к практическому примеру демонстрирующему возможности Delphi при работе c Firebird/Interbase:
Законченный пример показан на картинке: ![]() Далее я приведу последовательность действий для воспроизведения примера саммостоятельно:
TDBCtrlGrid - это компонент-контейнер. Он может отображать как одну так и несколько записей в зависимости от значения свойства RowCount. Внутри него расположены компоненты для редактирования данных. TDBLabel - нередактируемое поле. При помощи этого компонента будем отображать колонку FULL_NAME. Для редактирования полей FIRST_NAME, LAST_NAME добавим на форму 2 компонента TDBText, у которых установим свойство DataField. Поле JOB_COUNTRY связано внешним ключом с таблицей COUNTRY. Для редактивания этого поля используем выпадающий список TDBComboBox содержащий коды стран. После установки поля DataField = JOB_COUNTRY, необходимо заполнить список данными из таблицы COUNTRY. Кроме описанных в примере, на вкладке Data Controls расположены компоненты для редактирования изображений (TDBImage), многострочного текста (TDBMemo), отображения списков и т.д. Передача изменений в БД - технология обновляемых множествIBProvider поддерживает замечательную возможность OLE DB - технологию обновляемых множеств. Благодаря этой технологии, в приведенном примере не пришлось прописывать в коде логику передачи изменений обратно в БД. Все изменения передавались автоматически через обновляемые множества. На данный момент технологию обновляемых множеств поддерживает только IBProvider v2. Пожалуйста учитывайте это при выборе провайдера для подключения. Клиентские и серверные курсорыДля перемещения по записям IBProvider использует курсоры. Они бывают серверные и клиентские. Клиентский курсор - хранится на стороне клиента. После выполнения запроса всё результирующее множество загружается в оперативную память или swap-файл драйвера. Это может вызывать задержки при передаче больших объемов данных, особенно по сети. По умолчанию в dbGo используется именно клиентский тип курсора. Это дает преимущество в быстродействии на небольших объемах данных. С клиентскими курсорами могут работать все три провайдера из состава IBPRovider Professional Edition. Серверный курсор используется при работе с большими наборами данных, которые невыгодно пересылать клиенту целиком. В результате сразу после выполнения запроса клиенту возвращается курсор, а данные считываются по мере необходимости. Кроме того реализация IBProvider, позволяет считывать BLOB-поля по мере обращения к ним, а не при получении всей записи. Это так же повышает производительность, в случае если в одной записи содержится несколько BLOB-колонок с большими данными. В текущей реализации серверный курсор можно использовать только с IBProvider v1, т.к. только он поддерживает 4-х байтные закладки, которые используются в dbGo для работы в режиме серверных курсоров. Более новые версии IBProvider используют уже 8-байтные закладки. За тип курсора отвечает свойство CursorLocation. Оно может принимать значения clUseServer и clUseClient. Какой провайдер выбрать?В состав IBProvider Professional входят три OLE DB провайдера, которые предоставляют разработчику различные возможности. IBProvider v1 - на данный момент единственный провайдер, позволяющий работать с dbGo компонентами в режиме серверных курсоров. Это связанно с ограниченным размером закладок в dbGo = 4 байта. Мы уже запланировали сделать IBProvider v3 совместимым с серверными курсорами dbGo в Delphi и C++ Builder. Как только это будет реализовано, IBProvider v1 станет историей. Для использования провайдера, укажите в строке подключения Provider=LCPI.IBProvider.1 IBProvider v2 поддерживает технологию обновляемых множеств. Благодаря им появляется возможность передавать изменения обратно в БД без явного указания текстов команд на вставку/удаление/обновление. Провайдер самостоятельно генерирует SQL-команды на основании select-выражений. Пример использования этой технологии я привел выше. Для использования провайдера, укажите в строке подключения Provider=LCPI.IBProvider.2. В наших ближайших планах реализовать поддержку обновляемых множеств в IBProvider v3. IBProvider v3 самый современный и производительный из всех провайдеров. Он обладает уникальным набором технологий, поддерживает все кодовые страницы, специальные возможности последних версий серверов Firebird и Interbase, 64-битные операционные системы и множество других полезных функций. Если вы не планируете использовать обновляемые множества или серверные курсоры однозначно выбирайте IBProvider v3. Для этого укажите в строке подключения Provider=LCPI.IBProvider.3 или Provider=LCPI.IBProvider. Если вам необходимо использовать возможности всех трех драйверов в одном Delphi-приложении, то в качестве временного решения, рекомендую использовать три одинаковых подключения к БД с разными драйверами. К примеру, все основные операции пропускать через IBProvider v3, обновляемые множества через IBProvider v2, а кешировать данные через серверные курсоры с IBProvider v1. После того как обновляемые множества и поддержка серверных курсоров dbGo будет доступна в IBProvider v3 можно будет оставить только одно подключение. Компонент TADOQueryКомпонент TADOQuery предназначен для выполнения SQL-команд. Его можно рассматривать, как аналог компонента TSQLQuery из dbExpress. Связь с базой данных устанавливается через свойства Connection или ConnectionString. Текст запроса записывается в свойство SQL. Если запрос возвращает набор данных, следует использовать метод Open() или свойство Active=true. Если запрос не должен возвращать набор данных, то его необходимо выполнять с помощью метода ExecSQL. ExecSQL возвращает число записей, которые были обработаны во время выполнения запроса. Это же значение содержится в свойстве RowsAffected. SQL-запросы с параметрамиЗапросы могут быть параметризованными. При помощи параметров команды можно задавать условия и передавать данные серверу БД. Существуют два вида параметров: Именованные и позиционные. По умолчанию именованные параметры в IBProvider задаются через двоеточие (:), a позиционные через знак вопроса (?). Для демонстрации работы компонента TADOQuery напишем пример, в котором рассмотрим три варианта его применения:
Законченный пример показан на картинке. Для выборки множества, а так же для выпонлнения операций вставки/удаления используется компонент TADOQuery: ![]() Компоненты на форме связаны следующим образом: TADOQuery запрашивает данные у БД, которая указана в TADOConnection и передает их в компонент-посредник TDataSource. TDBGrid умеет отображать данные, которые загружены в TDataSource. Получается следующая схема взаимодействия: ADOConnection->ADOQuery->DataSource (вкладка Data Access)->DBGrid. Рассмотрим первый вариант использования TADOQuery - выполнение запросов, которые не возвращают результирующее множество:
В приведенном примере параметры команды устанавливаются двумя различными способами: 1. Одним выражением за раз:
2. И каждый параметр отдельно: Для выборки данных через TADOQuery используется SQL-выражение, содержащее команду SELECT, и метод Open(): TADOStoredProcКомпонент TADOStoredProc позволяет выполнять хранимые процедуры Interbase и Firebird. Принцип работы TADOStoredProc такой же как и у TADOQuery:
Единственные отличием является свойство ProcedureName в котором определяется имя хранимой процедуры. Свойство SQL в компоненте TADOStoredProc отсутствует Хранимая процедура может возвращать результат двумя способами:
Для получения результирующего множества используется оператор SELECT:
Для выполнения процедуры, которая ничего не возвращает или возвращает OUT-параметры необходимо использовать инструкцию exec:
Компонент TADOCommandTADOCommand - команда, которая передается серверу, для того чтобы считать или изменить данные. Компонент фактически объединяет в себе возможности 3-х рассмотренных компонентов: TADOTable, TADOQuery, TADOStoredProc. Поведение TADOCommand меняется в зависимости от свойства CommandType. Оно может принимать следующие значения:
Работа с транзакциямиМеханизмы управления транзакциями в IBProvider одинаковы для всех средств разработки. Ранее я подробно расматривал транзакции в первой части руководства по работе с Interbase и Firebird в ADO .Net. Рекомендую вам обратить внимание на следующие его главы:
Полезные ссылки
| ||