{codecitation class="brush: pascal; gutter: false;" width="600px"}

Использование псевдонима для доступа к базе данных обеспечивает независимость программы от размещения данных в системе, позволяет размещать программу работы с данными и базу данных на разных дисках компьютера, в том числе и на сетевом. Вместе с тем, для простых баз данных типичным решением является размещение базы данных в отдельном подкаталоге того каталога, в котором находится программа работы с базой данных. Таким образом, программа работы с базой данных всегда «знает», где находятся данные. При таком подходе можно отказаться от создания псевдонима при помощи BDE Administrator и возложить задачу создания псевдонима на программу работы с базой данных. Причем, псевдоним будет создаваться автоматически во время запуска программы и уничтожаться во время завершения ее работы. Очевидно, что такой подход облегчает администрирование базы данных.

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

unit school3_;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

Dialogs, Grids, DBGrids, Db, DBTables, ExtCtrls, DBCtrls, StdCtrls;

type

TForm1 = class (TForm)

Table1: TTable; // таблица (вся база данных)

Query1: TQuery; // запрос (записи БД, удовлетворяющие критерию выбора)

DataSource1: TDataSource; // источник данных — таблица или запрос

DBGrid1: TDBGrid; // таблица для отображения БД или результата выполнения запроса

DBNavigator1: TDBNavigator;

DBText1: TDBText;

Button1: TButton; // кнопка запрос

Button2: TButton; // кнопка Все записи

procedure Button1Click (Sender: TObject);

procedure Button2Click (Sender: TObject);

procedure FormActivate (Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

// щелчок на кнопке Запрос

procedure TForm1.Button1Click (Sender: TObject);

var

fam: string[30];

begin

fam:= InputBox ('Выборка информации из БД',

'Укажите фамилию и щелкните на OK.', '');

if fam '' // пользователь ввел фамилию

then

begin

with form1.Query1 do begin

Close; // закрыть файл-результат выполнения предыдущего запроса

SQL.Clear; // удалить текст предыдущего запроса

// записываем новый запрос в свойство SQL

SQL.Add ('SELECT Fam, Name, Class');

SQL.Add ('FROM «:Школа:school.db»');

SQL.Add ('WHERE');

SQL.Add ('(Fam = «' fam '»)');

SQL.Add ('ORDER BY Name, Fam');

Open; // активизируем выполнение запроса

end;

if Query1.RecordCount 0 then

DataSource1.DataSet:= Query1 // отобразить рез-т выполнения запроса

else begin

ShowMessage ('В БД нет записей, удовлетворяющих критерию запроса.');

DataSource1.DataSet:= Table1;

end;

end;

end;

// щелчок на кнопке Все записи

procedure TForm1.Button2Click (Sender: TObject);

begin

DataSource1.DataSet:= Table1; // источник данных — таблица

end;

// активизация формы

procedure TForm1.FormActivate (Sender: TObject);

begin

with Session do

begin

ConfigMode:= cmSession;

try

{ Если файл данных находиться в том же каталоге,

что и выполняемый файл программы, то в программе

путь к файлу данных может быть получен из командной

строки при помощи функции ExtractFilePath (ParamStr (0)).

В приведенном примере файл данных находиться в подкаталоге

DATA каталога программы. }

// создадим временный псевдоним для базы данны

AddStandardAlias ('Школа',

ExtractFilePath (ParamStr (0)) 'DATA\',

'PARADOX');

Table1.Active:= True; // откроем базу данных

finally

ConfigMode:= cmAll;

end;

end;

end;

end.

В рассматриваемом варианте программы предполагается, что база данных содержится в подкаталоге DATA того каталога, в котором находится выполняемый файл программы. Создает псевдоним процедура TForm1.FormActivate. Непосредственное создание псевдонима выполняет процедура AddstandardAlias, которой в качестве параметра передается имя псевдонима и соответствующее ему имя каталога. Так как во время разработки программы нельзя знать, в каком каталоге будет размещена программа работы с базой данных и, следовательно, подкаталог базы данных -DATA, имя каталога определяется во время работы программы путем обращения к функциям ParamStr (0) и ExtractFilePatch. Значение первой -полное имя выполняемого файла программы, второй — путь к этому файлу. Таким образом, процедуре AddstandardAiias передается полное имя каталога базы данных.

{/codecitation}

{codecitation class="brush: pascal; gutter: false;" width="600px"}

Автор: Tom Stickle

var

pszAliasName: PChar; { Имя псевдонима }

pszDriverType: PChar; { Тип драйвера для псевдонима }

pszParams: PChar; { Дополнительные параметры }

bPersist: Bool; { Постоянный или временный псевдоним }

dbiRes: Integer; { Возвращаемый код }

begin

pszAliasName:= strAlloc (25);

pszDriverType:= strAlloc (25);

pszParams:= strAlloc (100);

try

bPersist:= True;

strPcopy (pszAliasName, 'Lance');

strPcopy (pszDriverType, 'PARADOX');

strPcopy (pszParams, 'PATH:' 'c:\Paradox\');

dbiRes:= DbiAddAlias (nil, pszAliasName, pszDriverType, pszParams,

bPersist);

finally

strDispose (pszAliasName);

strDispose (pszDriverType);

strDispose (pszParams);

end;

end;

{/codecitation}

{codecitation class="brush: pascal; gutter: false;" width="600px"}

Эта информация поможет вам разобраться в вопросе создания и использования ПСЕВДОНИМОВ баз данных в ваших приложениях.

Вне Delphi создание и конфигурирование псевдонимов осуществляется утилитой BDECFG.EXE. Тем не менее, применяя компонент TDatabase, вы можете в вашем приложении создать и использовать псевдоним, не определенный в IDAPI.CFG.

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

Некоторые варианты решения задачи:

Пример #1:

Пример #1 создает и конфигурирует псевдоним для базы данных STANDARD (.DB,.DBF). Псевдоним затем используется компонентом TTable.

Пример #2:

Пример #2 создает и конфигурирует псевдоним для базы данных INTERBASE (.gdb). Псевдоним затем используется компонентом TQuery для подключения к двум таблицам базы данных.

Пример #3:

Пример #3 создает и конфигурирует псевдоним для базы данных STANDARD (.DB,.DBF). Демонстрация ввода псевдонима пользователем и его конфигурация во время выполнения программы.

Пример #1: Используем базу данных.DB или.DBF (STANDARD)

Создаем новый проект.

Располагаем на форме следующие компоненты: — TDatabase, TTable, TDataSource, TDBGrid, and TButton.

Дважды щелкаем на компоненте TDatabase или через контекстное меню (правая кнопка мыши) вызываем редактор базы данных.

Присваиваем базе данных имя 'MyNewAlias'. Это имя будет выполнять роль псевдонима в свойстве DatabaseName для компонентов типа TTable, TQuery, TStoredProc.

Выбираем в поле Driver Name (имя драйвера) пункт STANDARD.

Щелкаем на кнопке Defaults. Это автоматически добавляет путь (PATH=) в секцию перекрытых параметров (окно Parameter Overrides).

Устанавливаем PATH= to C:\DELPHI\DEMOS\DATA (PATH=C:\DELPHI\DEMOS\DATA).

Нажимаем кнопку OK и закрываем окно редактора.

В компоненте TTable свойству DatabaseName присваиваем 'MyNewAlias'.

В компоненте TDataSource свойству DataSet присваиваем 'Table1'.

В компоненте DBGrid свойству DataSource присваиваем 'DataSource1'.

Создаем в компоненте TButton обработчик события OnClick.

procedure TForm1.Button1Click (Sender: TObject);

begin

Table1.Tablename:= 'CUSTOMER';

Table1.Active:= True;

end;

Запускаем приложение.

*** В качестве альтернативы шагам 3 — 11, вы можете включить все эти действия в сам обработчик:

procedure TForm1.Button1Click (Sender: TObject);

begin

Database1.DatabaseName:= 'MyNewAlias';

Database1.DriverName:= 'STANDARD';

Database1.Params.Clear;

Database1.Params.Add ('PATH=C:\DELPHI\DEMOS\DATA');

Table1.DatabaseName:= 'MyNewAlias';

Table1.TableName:= 'CUSTOMER';

Table1.Active:= True;

DataSource1.DataSet:= Table1;

DBGrid1.DataSource:= DataSource1;

end;

Пример #2: Используем базу данных INTERBASE

Создаем новый проект.

Располагаем на форме следующие компоненты: — TDatabase, TQuery, TDataSource, TDBGrid, and TButton.

Дважды щелкаем на компоненте TDatabase или через контекстное меню (правая кнопка мыши) вызываем редактор базы данных.

Присваиваем базе данных имя 'MyNewAlias'. Это имя будет выполнять роль псевдонима в свойстве DatabaseName для компонентов типа TTable, TQuery, TStoredProc.

Выбираем в поле Driver Name (имя драйвера) пункт INTRBASE.

Щелкаем на кнопке Defaults. Это автоматически добавляет путь (PATH=) в секцию перекрытых параметров (окно Parameter Overrides).

SERVER NAME=IB_SERVEER:/PATH/DATABASE.GDB

USER NAME=MYNAME

OPEN MODE=READ/WRITE

SCHEMA CACHE SIZE=8

LANGDRIVER=

SQLQRYMODE=

SQLPASSTHRU MODE=NOT SHARED

SCHEMA CACHE TIME=-1

PASSWORD=

Устанавливаем следующие параметры

SERVER NAME=C:\IBLOCAL\EXAMPLES\EMPLOYEE.GDB

USER NAME=SYSDBA

OPEN MODE=READ/WRITE

SCHEMA CACHE SIZE=8

LANGDRIVER=

SQLQRYMODE=

SQLPASSTHRU MODE=NOT SHARED

SCHEMA CACHE TIME=-1

PASSWORD=masterkey

В компоненте TDatabase свойство LoginPrompt устанавливаем в 'False'. Если в секции перекрытых параметров (Parameter Overrides) задан пароль (ключ PASSWORD) и свойство LoginPrompt установлено в 'False', при соединении с базой данный пароль запрашиваться не будет. Предупреждение: при неправильно указанном пароле в секции Parameter Overrides и неактивном свойстве LoginPrompt вы не сможете получить доступ к базе данных, поскольку нет возможности ввести правильный пароль — диалоговое окно «Ввод пароля» отключено свойством LoginPrompt.

Нажимаем кнопку OK и закрываем окно редактора.

В компоненте TQuery свойству DatabaseName присваиваем 'MyNewAlias'.

В компоненте TDataSource свойству DataSet присваиваем 'Query1'.

В компоненте DBGrid свойству DataSource присваиваем 'DataSource1'.

Создаем в компоненте TButton обработчик события OnClick.

procedure TForm1.Button1Click (Sender: TObject);

begin

Query1.SQL.Clear;

Query1.SQL.ADD (

'SELECT DISTINCT * FROM CUSTOMER C, SALES S

WHERE (S. CUST_NO = C. CUST_NO)

ORDER BY C. CUST_NO, C. CUSTOMER');

Query1.Active:= True;

end;

Запускаем приложение.

Пример #3: Ввод псевдонима пользователем

Этот пример выводит диалоговое окно и создает псевдоним на основе информации, введенной пользователем.

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

Выполняем шаги 1–11 из примера #1.

Пишем следующий обработчик события OnClick компонента TButton:

procedure TForm1.Button1Click (Sender: TObject);

var

NewString: string;

ClickedOK: Boolean;

begin

NewString:= 'C:\';

ClickedOK:= InputQuery ('Database Path',

'Path: --> C:\DELPHI\DEMOS\DATA', NewString);

if ClickedOK then

begin

Database1.DatabaseName:= 'MyNewAlias';

Database1.DriverName:= 'STANDARD';

Database1.Params.Clear;

Database1.Params.Add ('Path=' NewString);

Table1.DatabaseName:= 'MyNewAlias';

Table1.TableName:= 'CUSTOMER';

Table1.Active:= True;

DataSource1.DataSet:= Table1;

DBGrid1.DataSource:= DataSource1;

end;

end;

Запускаем приложение.

{/codecitation}

{codecitation class="brush: pascal; gutter: false;" width="600px"}

Я делаю это все время. У меня есть INI-файл, который сообщает, где можно найти таблицы и каталоги их расположения. Вот как я это делаю:

procedure CheckTable (var Table: TTable; var TName: string);

var

ChangePath: boolean;

Path: string;

ActiveState: Boolean;

begin

if (TName = '') then

TName:= Table.TableName

else

with Table do

begin

ActiveState:= Active;

Close;

Path:= ExtractFilePath (TName);

ChangePath:= HasAttr (DatabaseName, faDirectory) or

(CompareText (DatabaseName, Path) 0);

if (Length (Path) > 0) and ChangePath then

DatabaseName:= Path;

if (CompareText (ExtractFileName (Tname), TableName) 0)

then

TableName:= ExtractFileName (Tname);

Active:= ActiveState;

end;

end;

{/codecitation}

{codecitation class="brush: pascal; gutter: false;" width="600px"}

Автор: Eryk

Как с помощью DELPHI попроще изменить путь псевдонима (Alias Path)?

Вы можете создать виртуальный псевдоним (т. е. не сохраняемый в IDAPI.CFG) с помощью компонента TDataBase… и затем изменить ассоциированный DOS-путь на нужный вам.

Для примера:

var

d: TDatabase;

begin

d:= TDatabase.Create (Application);

d.DataBaseName:= 'TEST_ALIAS';

d.DriverName:= 'STANDARD';

d.Params.Add ('PATH=C:\DBDEMOS');

d.Connected:= True;

end;

…приведенный код может быть и бесполезен, но он показывает как это можно сделать. Также это можно сделать во время разработки приложения с помощью Инспектора Объектов.

{/codecitation}