Для установления соединения с сервером базы данных служит компонент SQLConnection, который представляет собой аналог компонента DataBase в BDE.
Этот компонент взаимодействует с двумя файлами, расположенными в каталоге ..\Common Files\Borland Shared\DBExpress. Файл dbxdrivers.ini содержит список инсталлированных драйверов серверов БД и для каждого драйвера список динамически подключаемых библиотек и параметров соединений, установленных по умолчанию. Список соединений с параметрами соединений содержится в файле dbxconnections.ini. Для наглядности приведем фрагмент кода из этого файла:
[OrасleConnection]
DriverName=Orасle
DataBase=Database Name
User_Name=user
Password=password
RowsetSize=20
BlobSize=-1
ErrorResourceFile=
LocaleCode=0000
Oracle TransIsolation=ReadCommited
OS Authentication=False
Multiple Transaction=False
Trim Char=false
Поместив компонент SQLConnection в форму (или модуль данных) на этапе разработки приложения, можно выбрать одно из существующих соединений, либо создать новое соединение с помощью диалогового окна Редактора соединений. Вызов указанного окна можно выполнить выбором пункта Edit Connection Properties контекстного меню компонента.
Редактор соединений позволяет настроить существующее соединение dbExpress или создать новое соединение, а также проверить правильность настроек с помощью кнопки Test Connection. Параметры соединения также можно настраивать с помощью Инспектора объектов (свойство Params типа TStrings).
Параметры соединения для основных серверов баз данных приведены в таблице ниже.
Сервер БД | Параметр | Значение |
Все серверы | BlobSize | Ограничение на объем пакета для данных типа BLOB |
DriverName | Имя драйвера | |
ErrorResourceFile | Файл сообщений об ошибках | |
LocaleCode | Код локализации, определяющий влияние национальных символов на сортировку данных | |
User_Name | Имя пользователя | |
Password | Пароль | |
<имя сервера БД> Translsolation | Уровень изоляции транзакций для сервера с заданным именем | |
InterBase | CommitRetain | Поведение курсора по завершению транзакции: true - обновление; false - удаление |
RoleName | Роль пользователя | |
SQLDialect | Используемый диалект SQL | |
Trim Char | Возможность удаления из строковых значений полей пробелов, дополняющих их до полной строки | |
WaitOnLocks | Разрешение на ожидание занятых ресурсов | |
DataBase | Имя файла базы данных (с расширением gdb) | |
DB2 | DataBase | Имя клиентского ядра |
MySQL | DataBase | Имя базы данных |
Microsoft SQL Server 2000 | HostName | Имя компьютера, на котором установлен сервер |
Microsoft SQL Server 2000 | DataBase | Псевдоним (алиас) имени базы данных |
Microsoft SQL Server 2000 | OS Autenification | Использование учетной записи текущего пользователя операционной системы при доступе к ресурсам сервера |
Informix | Trim Char | Возможность удаления из строковых значений полей пробелов, дополняющих значение до полной строки |
Oracle | AutoCommit | Флаг завершения транзакции. Устанавливается сервером |
BlockingMode | Режим завершения запроса, true - соединение дожидается окончания запроса; false - начинает выполнение следующего запроса | |
Multiple Transaction | Возможность управления несколькими транзакциями в одном сеансе | |
DataBase | Запись базы данных в файле TNSNames.ora |
После описанной настройки параметров соединений для компонента SQLConnection с помощью Инспектора объектов можно выбрать соединение (свойство ConnectionName) для нужного сервера баз данных. При этом автоматически устанавливаются значения связанных с ним свойств:
- DriverName (имя драйвера)
- LibraryName (имя динамически подключаемой библиотеки Драйвера)
- Params (параметры соединения)
- VendorLib (имя динамически подключаемой библиотеки клиентской части сервера)
Открытие соединения с сервером БД осуществляется заданием свойству Connected типа bool значения true. Например, при выполнении приложения это можно сделать с помощью кода:
SQLConnection1->Connected = true;
Соответственно закрыть соединение с сервером можно путем задания этому свойству значения false. Названные операции могут быть выполнены также с помощью методов:
void __fastcall Open (void);
void __fastcall Close(void);
С помощью свойства LoginPrompt типа bool выполняется задание необходимости (true) или ненужности (false) отображения окна авторизации для ввода имени пользователя (User_Name) и пароля (Password) при каждой попытке соединения с сервером. В последнем случае эти значения будут браться из файла dbxconnections.ini.
После открытия соединения все компоненты dbExpress, инкапсулирующие наборы данных и связанные с открытым компонентом SQLConnection, получают доступ к базе данных.
При установлении соединения с сервером InterBase в качестве имени пользователя и пароля можно использовать строки Sysdba и masterkey.
При открытии и закрытии соединения можно воспользоваться любым из доступных событий, например:
__property Classes::TNotifyEvent AfterConnect = {read=FAfterConnect, write=FAfterConnect};
__property Classes::TNotifyEvent AfterDisconnect = {read=FAfterDisconnect, write=FAfterDisconnect};
__property Classes::TNotifyEvent BeforeConnect = {read=FBeforeConnect, write=FBeforeConnect};
__property Classes::TNotifyEvent BeforeDisconnect = {read=FBeforeDisconnect, write =FBeforeDisconnect};
property OnLogin: TSQLConnectionLoginEvent;
Например, событие BeforeConnect можно использовать для вызова функции, выполняющей дешифрование пароля доступа к базе данных. Соответствующий обработчик события может быть задан следующим образом:
void __fastcall TForm1::SQLConnectionBeforeConnect(TObject *Sender)
{
if (SQLConnection1->LoginPrompt == false)
{
SQLConnection1->Params->Values["User_Name"] = "SYSDBA";
SQLConnection1->Params->Values["Password"] = Decrypt(SQLConnection1->Params->Values["Password"]);
}
Событие OnLogin наступает в случае, если свойству LoginPrompt установлено значение true. Если это свойство имеет значение true, и нет обработки события OnLogin, то пользователю будет предложен стандартный диалог авторизации. Узнать о текущем состоянии соединения позволяет свойство:
__property TConnectionState ConnectionState = {read=FConnectionState, write=FConnectionState};
тип которого описан так:
enum TConnectionState {csStateClosed, csStateOpen, csStateConnecting, csStateExecuting, csStatePetching, csStateDisconnecting};
Указанные в определении типа значения соответствуют следующим состояниям соединения:
- csStateClosed - закрыто
- csStateOpen - открыто
- csstateConnecting - установление соединения
- csStateExecuting - ожидание исполнения переданного SQL-запроса
- csstateFetching - получение данных с сервера
- csStateDisconnecting - завершение соединения
Компонент SQLConnection позволяет выполнять SQL-запросы с помощью следующей функции:
int __fastcall Execute (const AnsiString SQL, TParams Params, void *Resuitset = NULL);
выполняет запрос, определенный значением константы SQL, с параметрами Params, используемыми в SQL-запросе. Используемые в запросе параметры должны иметь тот же порядок следования, что в params и в инструкции SQL. Если SQL-запрос не содержит параметров, то свойству Params требуется задать значение NULL. Если при выполнении SQL-запроса возвращается результат, то в параметр ResultSet помещается указатель на объект типа TCustomSQLDataSet, содержащий результат.
При отсутствии в запросе параметров и возвращения записей рекомендуется использовать функцию:
int __fastcall Execute (const AnsiString SQL, void *Resuitset);
которая возвращает значение о при успешном завершении запроса или код ошибки в противном случае.
Подобно своим аналогам в BDE компонент SQLConnection позволяет выполнять запуск, фиксацию и откат транзакций соответственно с Помощью методов: StartTransaction, Commit и Rollback.