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

Автор: Nomadic

По таблице (фактически по Database) получить физическое местонахождение.

Примечание: Database можно создать явно, если нет, Дельфи сама его создаст, доступ к ней по Table (Query).Database

uses DbiProcs;

function GetDirByDatabase (Database: TDatabase): string;

var

pszDir: PChar;

begin

pszDir:= StrAlloc (255);

try

DbiGetDirectory (Database.Handle, True, pszDir);

Result:= StrPas (pszDir);

finally

StrDispose (pszDir);

end;

end;

По алиасу

function GetPhNameByAlias (sAlias: string): string;

var

Database: TDatabase;

pszDir: PChar;

begin

Database:= TDatabase.Create (nil); {allocate memory}

pszDir:= StrAlloc (255);

try

Database.AliasName:= sAlias;

Database.DatabaseName:= 'TEMP'; {requires a name -- is ignored}

Database.Connected:= True; {connect without opening any table}

DbiGetDirectory (Database.Handle, True, pszDir); {get the dir.}

Database.Connected:= False; {disconnect}

Result:= StrPas (pszDir); {convert to a string}

finally

Database.Free; {free memory}

StrDispose (pszDir);

end;

end;

{/codecitation}

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

Попробуйте это:

type

TDataMod = class (TDataModule)

Database: TDatabase;

public

procedure TempAlias (NewAlias, NewDir: string);

end;

procedure TDataMod.TempAlias (NewAlias, NewDir: string);

begin

with Session do

if not IsAlias (NewAlias) then

begin

ConfigMode:= cmSession; (* NewAlias будет ВРЕМЕННЫМ *)

try

AddStandardAlias (NewAlias, NewDir, 'PARADOX');

Database.Close;

Database.AliasName:= NewAlias;

Database.Open;

finally

ConfigMode:= cmAll;

end;

end;

end;

Комментарии:

a) Поместите компонент Database на форму DataModule;

b) Задайте свойству DatabaseName имя базы данных, например, 'TempDB';

c) Задайте свойству DatabaseName компонента TTable значение = 'TempDB'

d) Для получения дополнительной информации ознакомьтесь с примером MastApp, поставляемым вместе с D2.

{/codecitation}

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

Попробуйте следующий код:

var

theStrList: TStringList;

GPath: String;

begin

theStrList:= TStringList.Create;

{Используем GetAliasParams для получения псевдонимов и ассоциированных с ними путей}

Session.GetAliasParams (,theStrList);

{Удаляем первые шесть символов, которые всегда равны «PATH=»}

GPath:= copy (theStrList[0],6,length (theStrList[0]))

theStrList.Free;

end;

{/codecitation}

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

Этот пример показывает один из способов создания ODBC драйвера для доступа к файлу Access MDB. Подобная операция применима к большинству файлов баз данных. Естевственно, Вам потребуется MDB файл, для того, чтобы связать его с DSN.

const

ODBC_ADD_DSN = 1; // Добавляем источник данных

ODBC_CONFIG_DSN = 2; // Конфигурируем (редактируем) источник данных

ODBC_REMOVE_DSN = 3; // Удаляем источник данных

ODBC_ADD_SYS_DSN = 4; // Добавляем системный DSN

ODBC_CONFIG_SYS_DSN = 5; // Конфигурируем системный DSN

ODBC_REMOVE_SYS_DSN = 6; // удаляем системный DSN

type

TSQLConfigDataSource = function (hwndParent: HWND; fRequest: WORD;

lpszDriver: LPCSTR; lpszAttributes: LPCSTR): BOOL; stdcall;

procedure Form1.FormCreate (Sender: TObject);

var

pFn: TSQLConfigDataSource;

hLib: LongWord;

strDriver: string;

strHome: string;

strAttr: string;

strFile: string;

fResult: BOOL;

ModName: array[0..MAX_PATH] of Char;

srInfo: TSearchRec;

begin

Windows.GetModuleFileName (HInstance, ModName, SizeOf (ModName) );

strHome:= ModName;

while (strHome[length (strHome)] '\' ) do

Delete (strHome, length (strHome), 1 );

// Тестовая база данных (Axes = Access)

strFile:= strHome 'TestData.MDB';

// загружаем библиотеку (путь по умолчанию)

hLib:= LoadLibrary ('ODBCCP32');

if (hLib NULL) then

begin

@pFn:= GetProcAddress (hLib, 'SQLConfigDataSource');

if (@pFn nil) then

begin

// начинаем создание DSN

strDriver:= 'Microsoft Access Driver (*.mdb)';

strAttr:= Format ('DSN=TestDSN' #0′DBQ=%s' #0

'Exclusive=1' #0′Description=Test Data' #0 #0, [strFile]);

fResult:= pFn (0, ODBC_ADD_SYS_DSN, @strDriver[1], @strAttr[1]);

if (fResult = false) then

ShowMessage ('Ошибка создания DSN (Datasource)!' );

// test/create MDB file associated with DSN

if (FindFirst ( strFile, 0, srInfo) 0 ) then

begin

strDriver:= 'Microsoft Access Driver (*.mdb)';

strAttr:= Format ('DSN=TestDSN' #0′DBQ=%s' #0′Exclusive=1' #0

'Description=Test Data' #0′CREATE_DB="%s"'#0 #0, [strFile,strFile]);

fResult:= pFn (0, ODBC_ADD_SYS_DSN, @strDriver[1], @strAttr[1]);

if (fResult = false) then

ShowMessage ('Ошибка создания MDB (файла базы данных)!' );

end;

FindClose (srInfo);

end;

FreeLibrary (hLib);

end

else

ShowMessage ('Невозможно загрузить ODBCCP32.DLL');

end;

{/codecitation}

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

procedure CheckAlias (const AliasName, AliasType, AliasPath: String);

{ Если алиас не существует, создать его }

var

SList: TStrings;

i: Integer;

AliasFound: Boolean;

begin

{ Проверка существования алиса BDE }

try

SList:= TStringList.Create;

Session.GetAliasNames (SList);

AliasFound:= False;

for i:=0 to SList.Count-1 do

if SList[i]=AliasName then

begin

AliasFound:= True;

break;

end;

finally

SList.Free;

end;

if AliasFound then

begin

try

SList:= TStringList.Create;

Session.GetAliasParams (AliasName,SList);

{А в 4-ой версии SList[2]!!! и без слова Path }

if SList[0] 'PATH=' AliasPath then { Правильно ли задан путь }

begin

SList[0]:= 'PATH=' AliasPath;

Session.ModifyAlias (AliasName,SList);

end;

finally

SList.Free;

end;

end

else

Session.AddStandardAlias (AliasName,AliasPath,AliasType); { Создать новый алиас }

Session.SaveConfigFile;

end;

{/codecitation}