Search code examples
databasedelphifiredacadvantage-database-server

FireDAC Advantage DB Connection Type


I am contemplating the migration from Advantage Native Delphi components to FireDAC. I have been searching for a way to determine how with FireDAC I can determine the method that was used to connect to the server - Remote, Local, AIS (Internet).

I would be looking for the equivalent of TAdsConnection.ConnectionType.

Thanks Gary Conley


Solution

  • The function you're looking for is called AdsGetConnectionType. Its import you can find declared in the FireDAC.Phys.ADSCli module, but it's not used anywhere.

    But it's not so difficult to get its address and call it by yourself. For example (not a good one):

    uses
      FireDAC.Stan.Consts, FireDAC.Phys.ADSCli, FireDAC.Phys.ADSWrapper;
    
    var
      FTAdsGetConnectionType: TAdsGetConnectionType = nil;
    
    type
      TADSLib = class(FireDAC.Phys.ADSWrapper.TADSLib)
      end;
    
    function GetConnectionType(Connection: TFDConnection): Word;
    const
      AdsGetConnectionTypeName = 'AdsGetConnectionType';
    var
      CliLib: TADSLib;
      CliCon: TADSConnection;
      Status: UNSIGNED32;
      Output: UNSIGNED16;
    begin
      Result := 0;
      CliCon := TADSConnection(Connection.CliObj);
      CliLib := TADSLib(CliCon.Lib);
    
      if not Assigned(FTAdsGetConnectionType) then
        FTAdsGetConnectionType := CliLib.GetProc(AdsGetConnectionTypeName);
    
      if Assigned(FTAdsGetConnectionType) then
      begin
        Status := FTAdsGetConnectionType(CliCon.Handle, @Output);
        if Status = AE_SUCCESS then
          Result := Word(Output)
        else
          FDException(CliLib.OwningObj, EADSNativeException.Create(Status, CliLib, nil),
            {$IFDEF FireDAC_Monitor}True{$ELSE}False{$ENDIF});
      end
      else
        FDException(CliLib.OwningObj, [S_FD_LPhys, CliLib.DriverID],
          er_FD_AccCantGetLibraryEntry, [AdsGetConnectionTypeName]);
    end;
    

    Possible usage:

    case GetConnectionType(FDConnection1) of
      ADS_AIS_SERVER: ShowMessage('AIS server');
      ADS_LOCAL_SERVER: ShowMessage('Local server');
      ADS_REMOTE_SERVER: ShowMessage('Remove server');
    end;