我正在尝试查询 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
只包含 DriverID
、 Database
、 Server
、 User_Name
、 Password
。检查员显示:
(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_database
、 isc_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/