Следующая статья: Информация о псевдонимах BDE.
Как получить псевдоним или путь к таблице?
Решение 1: Есть три способа сделать это:
Первый годится только для постоянных псевдонимов BDE.
Второй работает с BDE и локальными псевдонимами.
Третий работает с BDE и локальными псевдонимами, используя «тяжелый» путь, через вызовы DBI.
function GetDBPath1(AliasName: string): Tname_; var ParamList: TStringList; begin ParamList:=TStringList.Create; with Session do try GetAliasParams(AliasName, ParamList); Result:=UpperCase(ParamList.Values['PATH'])+'\'; finally Paramlist.Free; end; end; function GetDBPath2(AliasName: string): Tname_; var ParamList: TStringList; i: integer; begin ParamList:=TStringList.Create; with Session do try try GetAliasParams(AliasName, ParamList); except for i:=0 to pred(DatabaseCount) do if (Databases[i].DatabaseName=AliasName) then ParamList.Assign(Databases[i].Params); end; Result:=UpperCase(ParamList.Values['PATH'])+'\'; finally Paramlist.Free; end; end; function GetDBPath3(ATable: TTable): Tname_; var TblProps: CURProps; pTblName, pFullName: DBITblName; begin with ATable do begin AnsiToNative(Locale, TableName, pTblName, 255); Check(DBIGetCursorProps(Handle, TblProps)); Check(DBIFormFullName(DBHandle, pTblName, TblProps.szTableType, pFullName)); Result:=ExtractFilePath(StrPas(pFullName)); end; end;
Решение 2
По таблице (фактически по Database) получить физическое местонахождение.
Примечание: Database можно создать явно, если нет, Delphi сама его создаст. Доступ к ней осуществляется по 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);
pszDir:=StrAlloc(255);
try
Database.AliasName:=sAlias;
Database.DatabaseName :='TEMP';
Database.Connected:=True;
DbiGetDirectory(Database.Handle, True, pszDir);
Database.Connected:=False;
Result:=StrPas(pszDir);
finally
Database.Free;
StrDispose(pszDir);
end;
end;