32 урока по Delphi

Урок 23: Управление соединением с базой данных (класс TDataBase,объект Session)

Содержание урока 23:
Обзор
Класс TDataBase
Создание постоянного соединения с базой данных
Определение собственного диалога при соединении с базой данных
Создание локального псевдонима базы данных
Изменение параметров соединения
Управление транзакциями
Объект Session
Указание сетевого протокола при соединении с БД
ex23.zip

1. Обзор

В данной статье рассказывается об управлении соединением с базой данных при помощи компоненты TDataBase и объекта TSession, который создается в программе автоматически. Описываются процедуры создания локального псевдонима базы данных и доступа к таблицам Paradox по паролю.

2. Класс TDataBase

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

- Создания постоянного соединения с базой данных
- Определения собственного диалога при соединении с базой данных (опрос пароля)
- Создания локального псевдонима базы данных
- Изменения параметров при соединении
- Управления транзакциями

TDataBase является невидимым во время выполнения объектом. Он находится на странице “Data Access” Палитры Компонент. Для включения в проект TDataBase нужно “положить” его на главное окно вашей программы.

Создание постоянного соединения с базой данных

Если вы работаете с базой данных, то перед началом работы выполняется процедура соединения с этой базой. В процедуру соединения, кроме прочего, входит опрос имени и пароля пользователя (кроме случая работы с локальными таблицами Paradox и dBase через IDAPI). Если в программе не используется TDataBase, то процедура соединения выполняется при открытии первой таблицы из базы данных. Соединение с базой данных обрывается, когда в программе закрывается последняя таблицы из этой базы (это происходит в том случае, если свойство KeepConnections объекта Session установлено в False, но об этом чуть позже). Теперь, если снова открыть таблицу, то процедура установки соединения повторится и это может быть достаточно неудобно для пользователя. Чтобы соединение не обрывалось даже в том случае, когда нет открытых таблиц данной базы, можно использовать компонент типа TDataBase. В свойстве AliasName укажите псевдоним базы данных, с которой работает программа; в свойстве DatabaseName - любое имя (псевдоним БД), на которое будут ссылаться таблицы вместо старого псевдонима базы. Свойство Connected установите в True - процедура соединения с базой будет выполняться при запуске программы. И, наконец, свойство KeepConnection нужно установить в True (см. рис.1).

Рис.A: Свойства TDataBase в Инспекторе объектов

В нашем примере, после задания свойств DataBase1 нужно у всех таблиц, работающих с IBLOCAL в свойстве DatabaseName поставить Loc_IBLOCAL.

Определение собственного диалога при соединении с базой данных

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

Рис.B: Диалог авторизации пользователя

При желании можно изменить внешний вид диалога или вообще его отменить. Для этого используются свойства и события класса TDataBase - LoginPrompt, Params и OnLogin.

Чтобы отключить опрос имени и пароля установите свойство LoginPrompt в False. При этом в свойстве Params требуется в явном виде (во время дизайна либо во время выполнения) указать имя и пароль пользователя. Например, в программе можно написать (до момента соединения с базой, например в событии для Form1 OnCreate) :

DataBase1.LoginPrompt:=False;

DataBase1.Params.Clear;

DataBase1.Params.Add(‘USER NAME=SYSDBA’);

DataBase1.Params.Add(‘PASSWORD=masterkey’);

DataBase1.Connected:=True;

Чтобы использовать свой собственный диалог, в котором можно опрашивать не только имя и пароль пользователя, но и, например, сетевой протокол - создайте обработчик события OnLogin для DataBase1:

procedure TForm1.Database1Login(Database: TDatabase;

LoginParams: TStrings);

begin

Form2.ShowModal;

if Form2.ModalResult = mrOK then

with LoginParams do begin

Values['USER NAME'] := User_Name;

Values['PASSWORD'] := User_Pass;

end;

end;

Здесь Form2 - новое окно-диалог для ввода имени и пароля, User_Name и User_Pass - строки, куда сохраняются введенные имя и пароль.

Создание локального псевдонима базы данных

Обычно, псевдоним базы данных(Alias) определяется в утилите конфигурации BDE и информация о нем сохраняется в файле конфигурации IDAPI.CFG. Однако, в программе можно использовать не только ранее определенный в утилите конфигурации BDE псевдоним базы данных, но и так называемый локальный (т.е. видимый только внутри данной программы) псевдоним. Это иногда бывает нужно, например, для того, чтобы обезопасить программу в случае удаления используемого псевдонима из файла конфигурации BDE.

Для того, чтобы создать локальный псевдоним БД, положите на главное окно проекта компонент DataBase1. Дальнейшие действия можно выполнить с помощью Инспектора Объектов, но удобнее это сделать через редактор компонент. Щелкните дважды мышкой на DataBase1 - появится диалог, показанный на рис.3

Рис.C: Редактор компоненты класса TDataBase

В этом диалоге требуется указать имя базы данных - это будет ее локальный псевдоним, на который ссылаются таблицы (свойство DatabaseName); тип драйвера (в нашем примере это INTRBASE); а также параметры, используемые при соединении с базой данных. Получить список параметров в поле “Parameter Overrides” можно по нажатию кнопки “Defaults”. Набор параметров зависит от типа БД, с которой вы работаете. Этим параметрам нужно присвоить требуемые значения - указать путь к серверу, имя пользователя и т.д. После выхода из редактора компонент имя, указанное в поле “Name” появится в списке имен баз данных для компонент типа TDataSet (TTable, TQuery etc.).

Изменение параметров при соединении

Иногда требуется изменить определенные в утилите конфигурации BDE параметры, используемые при установлении соединения с БД. Это можно сделать во время дизайна с помощью диалога, показанного на рис.3, в поле “Parameter Overrides”. Либо во время выполнения программы (до попытки соединения) прямым присвоением свойству Params объекта DataBase1:

DataBase1.Params.Add(‘LANGDRIVER=ancyrr’);

Управление транзакциями

TDataBase позволяет начать в БД транзакцию (метод StartTransaction), закончить (Commit) или откатить ее (RollBack). Кроме того, можно изменять уровень изоляции транзакций (свойство TransIsoltion).

TransIsolation Oracle Sybase and Informix InterBase

Microsoft SQL

Dirty read Read committed Read committed Dirty Read Read committed

Read committed(Default) Read committed Read committed Read committed Read committed

Repeatable read Repeatable read Read committed Repeatable Read Repeatable Read

“Dirty Read” - внутри вашей текущей транзакции видны все изменения, сделанные другими транзакциями, даже если они еще не завершились по Commit. “Read Committed” - видны только “закоммитченные” изменения, внесенные в базу. “Repeatable Read” - внутри транзакции видны те данные, что были в базе на момент начала транзакции, даже если там на самом деле уже имеются изменения.

1. Объект Session

Объект Session, имеющий тип TSession создается автоматически в программе, работающей с базами данных (в этом случае Delphi подключает в программу модуль DB). Вам не нужно заботиться о создании и уничтожении данного объекта, но его методы и свойства могут быть полезны в некоторых случаях. В этом компоненте содержится информация обо всех базах данных, с которыми работает программа. Ее можно найти в свойстве DataBases. Со свойством KeepConnections данного объекта мы уже знакомы. Это свойство определяет, нужно ли сохранять соединение с базой, если в программе нет ни одной открытой таблицы из этой базы. NetDir - директория, в которой лежит общий сетевой файл PDOXUSRS.NET, необходимый BDE. PrivateDir - директория для хранения временных файлов.

С помощью методов объекта Session можно получить информацию о настройках BDE, например, список всех псевдонимов, драйверов баз данных или список всех таблиц в базе.

Еще одно важное назначение объекта Session - доступ с его помощью к таблицам Paradox, защищенным паролем. Прежде, чем открыть такую таблицу, требуется выполнить метод AddPassword :

Session.AddPassword(‘my_pass’);

Удалить пароль можно с помощью метода RemovePassword или RemoveAllPasswords.

2. Указание сетевого протокола при соединении с БД

В случае с InterBase можно в явном виде указать, какой сетевой протокол используется при соединении с базой данных. Эта установка выполняется либо в утилите конфигурации BDE, либо в программе - нужно изменить параметр “SERVER NAME”, который содержит полный путь к файлу с базой данных.

Итак:

Протокол Параметр SERVER NAME

TCP/IP IB_SERVER:PATH\DATABASE.GDB ( nt:c:\ib\base.gdb ) ( unix:/ib/base.gdb )

IPX/SPX IB_SERVER:PATH\DATABASE.GDB ( nw@sys:ib\base.gdb )

NetBEUI \\IB_SERVER\PATH\DATABASE.GDB ( \\nt\c:\ib\base.gdb )