12. Компонент TSession

 

12.1. Назначение компонента TSession *

12.2. Работа с установками BDE *

12.3. Чтение имен таблиц базы данных *

12.4. Работа с базами данных *

12.4.1. Список объявленных БД *

12.4.2. Хранение соединения с неактивной БД *

12.4.3. Работа с активными БД *

12.5. Управление парольной защитой *

12.5.1. Работа с паролями для Paradox-таблиц *

12.5.2. Средства TSession для работы с паролями *

12.6. Определение служебных каталогов сессии *

12.7. Событие активизации сессии *

12. Компонент TSession

12.1. Назначение компонента TSession

Для каждого приложения в Delphi автоматически создается компонент типа TSession с именем Session. Он управляет всеми соединениями с базами данных. Его методы и свойства носят глобальный характер для всего приложения.

Обычно в приложении имеется один поток (Thread) работы с БД. В некоторых случаях можно создать два и более потока. При этом, если в каждом из этих потоков реализовать запросы к БД, они будут выполняться независимо друг от друга. В случае нескольких потоков, компонент типа TSession создается для каждого из них.

12.2. Работа с установками BDE

Метод procedure GetAliasNames(List: TStrings); очищает список List и затем заносит в него список псевдонимов БД , определенных в BDE.

Пример: Session.GetAliasNames(ListBoxl.Items) ;

Метод procedure GetAliasParams(const AliasName: string; List: TStrings); очищает список List и затем помещает в него параметры псевдонима AliasName.

Пример:

var TekAllias : String;

Session.GetAliasParams(TekAllias, ListBox2.Items);

Примеры возвращаемых результатов:

SERVER NAME=C:\Program

Files\Borland\IntrBase\EXAMPLES\EMPLOYEE.GDB

USER NAME=SYSDBA

OPEN MODE=READ/WRITE

SCHEMA CACHE SIZE=8

LANGDRIVER=

SQLQRYMODE=

SQLPASSTHRU MODE=SHARED AUTOCOMMIT

SCHEMA CACHE TIME=-1

PATH=d:\book\data

DEFAULT DRIVER=PARADOX

ENABLE BCD=FALSE

12.3. Чтение имен таблиц базы данных

procedure GetTableNames(const DatabaseName, Pattern: string; Extensions, SystemTables: Boolean; List: TStrings); очищает список List и добавляет в него имена всех таблиц, определяемых параметром DatabaseName. Если необходимо добавить имена только некоторых таблиц, шаблон их имени указывается параметром Pattern. Значение параметра SystemTables, равное True, включит в состав таблиц, чьи имена занесены в List, имена системных таблиц (для удаленных баз данных). Установка в True параметра Extensions приведет к включению в имена таблиц расширений имени файла.

Пример:

var TekAllias : String;

Session.GetTableNames(TekAllias, '*.*', False, False, ListBox5.Items);

Метод procedure GetDriverNames(List: TStrings); очищает список List и затем заносит в него информацию об установленных на текущий момент драйверах BDE. Заметим, что драйверов 'PARADOX' и 'DBASE' не существует, поскольку эти СУБД управляются драйвером 'STANDARD'.

Пример: Session.GetDriverNames(ListBox3.Items);

Метод procedure GetDriverParams(const DriverName: string; List: TStrings); очищает список List и затем заносит в него параметы по умолчанию для драйвера, названного в параметре DriverName. В случае использования Paradox или dBASE (DriverName = 'STANDARD') , имеет место только один параметр, 'РАТН='. Драйверы SQL-СУБД могут иметь переменное число параметров.

Пример:

var TekDriver : String;

Session.GetDriverParams(TekDriver,ListBox4.Items);

Пример результата для драйвера 'INTRBASE':

SERVER NAME=IB_SERVER:/PATH/DATABASE.GDB

USER NAME=MYNAME

OPEN MODE=READ/WRITE

SCHEMA CACHE SIZE=8

LANGDRIVER=

SQLQRYMODE=

SQLPASSTHRU MODE=SHARED AUTOCOMMIT

SCHEMA CACHE TIME=-1

MAX ROWS=-1

BATCH COUNT=200

ENABLE SCHEMA CACHE=FALSE

SCHEMA CACHE DIR=

ENABLE BCD=FALSE

Пример результата для драйвера 'STANDARD:'

РАТН=

DEFAULT DRIVER=PARADOX

12.4. Работа с базами данных

12.4.1. Список объявленных БД

Метод procedure GetAliasNames(List: TStrings); возвращает список псевдонимов БД, объявленных для BDE на данном компьютере.

Количество активных в данном приложении БД возвращает свойство property DatabaseCount: Integer; При этом отсчет активных БД ведется начиная с 0.

Свойство property Databases[Index: Integer]: TDatabase; обеспечивает доступ к активной БД с индексом Index; при этом каждой БД из списка Databases соответствует компонент типа TDatabase. Таким образом, при работе с каждой активной БД из списка Databases можно пользоваться свойствами, методами и событиями, присущими компоненту TDatabase.

Например, поместить в ListBox2 список активных БД приложения:

var i : Integer;

ListBox2.Clear;

WITH Session do begin

FOR i := 0 TO DatabaseCount - 1 do

ListBox2.Items.Add(Databases[i].DatabaseName) ;

END;//with

12.4.2. Хранение соединения с неактивной БД

Пусть некоторая БД имела наборы данных, открытые в определенный период времени, но затем эти НД были закрыты. Свойство property KeepConnections: Boolean; определяет, следует ли приложению хранить соединение с неактивными БД. False означает "не хранить"; при значении True соединение с неактивными БД будет ликвидировано либо при окончании работы приложения, либо после выполнения метода procedure DropConnections; К преимуществам постоянного соединения с неактивной БД можно отнести отсутствие необходимости выполнять повторное соединение с БД при открытии набора данных, использующего таблицы этой БД. А соединение, как известно, требует времени.

К недостаткам можно отнести расход ресурсов компьютера на поддержание постоянного соединения.

12.4.3. Работа с активными БД

Метод function OpenDatabase(const DatabaseName: string): TDatabase; пытается отыскать компонент TDatabase, у которого свойство DatabaseName совпадает с параметром DatabaseName метода FindDatabase. В случае успеха возвращается указатель на найденный и открытый компонент TDatabase; если такой компонент не существует, он создается, открывается и указатель на него возвращается в качестве результата работы метода. Метод OpenDatabase следует использовать в паре с методом CloseDatabase в блоке try...finally для обработки исключений, которые могут возникнуть при выполнении данных методов.

Метод procedure CIoseDatabase(Database: TDatabase); закрывает открытую БД, определяемую параметром Database, который содержит ссылку на экземпляр типа TDatabase. Принудительное закрытие БД практикуется достаточно редко, поскольку закрытие всех открытых БД производится при окончании работы приложения.

Метод function FindDatabase(const DatabaseName: string): TDatabase; пытается отыскать БД (компонент TDatabase} в коллекции TSession. Databases (коллекция открытых БД). Имя искомой БД определяется строковым параметром DatabaseName. Если в коллекции открытых БД сессии имеется такая БД, у которой значение DatabaseName совпадает с параметром DatabaseName метода FindDatabase, в качестве результата возвращается указатель на найденный компонент TDatabase. В противном случае возвращается nil.

12.5. Управление парольной защитой

Ниже описывается работа с паролями Paradox. При работе с иными СУБД обеспечение парольной защиты может отличаться.

12.5.1. Работа с паролями для Paradox-таблиц

Базой данных в Paradox, как известно, считается набор ТБД, хранящихся в одном месте. Каждая из таких таблиц физически занимает один файл и может иметь один или несколько паролей. При этом каждый из паролей может обеспечивать свои права доступа к таблице - доступ для чтения и записи, только для чтения и т.д. Более подробно с установкой паролей ТБД можно ознакомиться в среде Database Desktop, в разделе Table Properties \ Password Security. Окно Auxiliary Passwords (дополнительные пароли) позволяет определить для Paradox-ТБД несколько паролей с разными правами доступа (рис. 12.1.а и б).

Можно установить следующие права доступа:

• All - с данными в ТБД можно делать все, плюс изменять структуру самой ТБД и физически удалять ее из БД;

• Insert & Delete - можно добавлять, удалять, очищать данные, но нельзя реструктурировать таблицу и удалять ее из БД;

Data Entry - можно добавлять и изменять записи, но нельзя удалять записи, изменять структуру ТБД и удалять ее из БД;

Update - можно просматривать записи ТБД и изменять в записях значения неиндексных полей. Остальное нельзя;

Read Only - можно просматривать данные в таблице, но изменять их нельзя.

Кроме того, можно установить права доступа и к отдельным полям. Для этого необходимо сделать текущим нужное поле и нажимать кнопку Field Rights до тех пор, пока не будут выбраны нужные права по отношению к данному полю для данного пароля. Права доступа следующие:

All (по умолчанию) - любое изменение данных в поле, с учетом накладываемых на поле ограничений, если такие определены в DataBase Desktop;

Read Only - данные можно просматривать, но не изменять;

None - данные нельзя ни просматривать, ни изменять, Database Desktop прячет значения поля после открытия ТБД.

Таким образом, при попытке открытия ТБД, для которой определены пароли, выдается запрос на ввод паролей в виде следующего окна (рис. 12.2).

Add позволяет добавить один или несколько паролей в список паролей;

Remove удаляет текущий пароль; RemoveAll удаляет все введенные пароли и список паролей очищается; Ok закрывает окно, после чего все пароли в списке анализируются на соответствие действительным паролям данной ТБД, и, если хотя бы один из них отвечает требованиям, ТБД может быть открыта; Close отменяет попытку ввести пароль, ТБД не открывается.

12.5.2. Средства TSession для работы с паролями

Три метода TSession позволяют вводить пароли в список, удалить текущий пароль или удалить все пароли: procedure AddPassword(const Password: string); procedure RemoveAllPasswords; procedure ReniovePassword(const Password: string);

Можно не прибегать к помощи стандартного окна ввода паролей, а вводить их, например, из компонента TEdit и затем добавлять в список паролей: Session.AddPassword(Edit1.Text) ; После этого можно применить метод Table1.Open; для попытки открытия ТБД. В том случае, если с использованием AddPassword был введен хотя бы один пароль, дающий права доступа к таблице, ТБД будет открыта В противном случае будет вызвано стандартное окно запроса паролей.

Заметим, что используя методы AddPassword. RemoveAllPaswords. RemovePassword, можно написать собственное окно ввода паролей, если Вас не устраивает стандартное окно. Принудительный вызов стандартного диалога ввода паролей реализуется методом function GetPassword: Boolean;

Он вызывает обработчик события OnPassword (если определен). В противном случае выдает стандартный диалог ввода пароля. Если пользователь нажал кнопку ОК., метод возвращает True; в случае нажатия кнопки Cancel возвращает False.

Метод может использоваться для ввода пароля с отложенным открытием БД. Если введен правильный пароль, открытие БД или ТБД (для персональных СУБД) не приведет к повторному запросу на ввод пароля.

12.6. Определение служебных каталогов сессии

Свойство property NetFileDir: string; указывает каталог, в котором содержится управляющий сетевой файл BDE PDOXUSRS.NET. Это свойство обеспечивает одновременную работу нескольких пользователей в сети. Значение свойства NetFileDir замещает значение сетевого каталога, определяемого в параметрах Paradox-драйвера в утилите настройки параметров BDE (BDE Administrator).

property PrivateDir: string; Значение свойства PrivateDir определяет каталог, который используется для хранения временных файлов сессии БД.

12.7. Событие активизации сессии

Событие property OnStartup: TNotifyEvent; наступает при активизации сессии в тот момент, когда сессия еще не стала активной. Используя обработчик данного события, во время выполнения причожения можно устанавливать значения свойств NetFileDir и PrivateDir .