Получение пути псевдонима и таблицы

Как получить псевдоним или путь к таблице?

Решение 1:
Есть три способа сделать это:

  • Первый годится только для постоянных псевдонимов BDE.
  • Второй работает с BDE и локальными псевдонимами.
  • Третий работает с BDE и локальными псевдонимами, используя «тяжелый» путь, через вызовы DBI.
    function GetDBPath1(AliasName: string): TFileName;
    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): TFileName;
    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): TFileName;
    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;
    
    [Nomadic]