我正在尝试查询 Firebird 数据库的 SQL 方言(使用嵌入式驱动程序):

procedure TFrmFireDACEmbed.BtnGetDBDialectClick(Sender: TObject);
var
   lFDConnection : TFDConnection;
   lDriverLink   : TFDPhysFBDriverLink;
   l             : Integer;
begin
   if not DlgOpen.Execute then Exit;

   lDriverLink   := TFDPhysFBDriverLink.Create(nil);
   lFDConnection := TFDConnection.Create(nil);
   try
      lDriverLink.DriverID := 'FBEmbedded';
      lDriverLink.VendorLib := 'fbembed.dll';  // 32-bits embedded
      lFDConnection.DriverName := S_FD_FBId;
      lFDConnection.Params.Database := DlgOpen.FileName;
      lFDConnection.Params.Add('Server=127.0.0.1');
      lFDConnection.Params.UserName := 'SYSDBA';
      lFDConnection.Params.Password := 'masterkey';
      lFDConnection.LoginPrompt := False;
      lFDConnection.Open;
      l := lFDConnection.Params.IndexOf('SQLDialect');
      if l <> -1 then
         ShowMessage(lFDConnection.Params[l])
      else
         ShowMessage('SQLDialect not found');
   finally
      lFDConnection.Close;
      lFDConnection.Free;
      lDriverLink.Free;
   end;
end;

但是 lFDConnection.Params 只包含 DriverIDDatabaseServerUser_NamePassword

检查员显示:
(nil, $2F22820, #$D#$A, nil, 0, ',', '"', '=', [soWriteBOM,soTrailingLineBreak,soUseLocale], (('DriverID=FB', nil), ('Database=D:\Temp\KLANTEN.GDB', nil), ('Server=127.0.0.1', nil), ('User_Name=SYSDBA', nil), ('Password=masterkey', nil), ('', nil), ('', nil), ('', nil)), 5, 8, False, dupIgnore, False, (FireDAC.Stan.Def.TFDDefinition.ParamsChanged,$2F5C4F0), (FireDAC.Stan.Def.TFDDefinition.ParamsChanging,$2F5C4F0), False, TFDConnectionDef($2F5C534) as IFDStanDefinition)

并且 lFDConnection.Params.SQLDialect 不被编译器识别。

尽管挖掘系统表,我发现对于方言 3 db 的查询
select mon$sql_dialect from mon$database

将返回 3,但对于旧版本 mon$database 不存在。

如何检索任何方言的 SQL 方言?

目的是重写使用“幕后”函数的旧代码,如 isc_attach_databaseisc_database_info (必须动态链接、 GetProcAddress 等)。

最佳答案

如何获取连接的 Firebird 数据库的 SQL 方言?

您可以通过以下方式替换旧代码:

uses
  FireDAC.Phys.IBWrapper;

procedure TForm1.Button1Click(Sender: TObject);
var
  SQLDialect: Integer;
  IBDatabase: TIBDatabase;
begin
  IBDatabase := TObject(FDConnection1.CliObj) as TIBDatabase;
  SQLDialect := IBDatabase.db_sql_dialect;
end;

如何在运行时为 Firebird 数据库连接指定 SQL 方言?

您可以通过以下方式为 SQL 方言指定连接定义参数:
FDConnection1.Params.Add('SQLDialect=1');

或者通过类型转换到特定的 Firebird DBMS 连接定义类,如下所示:
TFDPhysFBConnectionDefParams(FDConnection1.Params).SQLDialect := 1;

关于delphi - 如何查询 Firebird SQL 方言,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49404046/

10-12 05:20