如何找到用于FireDac连接的MS Access版本和/或DLL名称?

时间:2017-02-22 22:18:25

标签: delphi firedac delphi-10.1-berlin

我有一个与Microsoft Access数据库的FireDac连接。我正在连接上配置Parms:

Connection.Params.Add('DriverID=MSAcc');
Connection.Params.Add('Database=' + FDatabasePath);
Connection.Connected := true;

一般来说这很有效。但是,在某些情况下安装了旧的MS Access驱动程序。我们希望检测到这种情况并提醒用户,以便他们可以安装新的驱动程序。

如何获取FireDac找到并用于建立连接的驱动程序版本或至少是VendorLib名称?

我知道我可以在打开连接之前在Phys Connection Link上指定VendorLib。我不想那样做。我希望FireDac能够通过它查找并使用系统上最相关的驱动程序。但是,一旦完成,我想知道它最终使用的驱动程序。

我尝试在连接打开后创建TFDPhysMSAccessDriverLink,希望设置ActualDriverId或VendorLib属性。但ActualDriverId是MsAcc,VendorLib是空白的。

1 个答案:

答案 0 :(得分:1)

1。获取驱动程序的版本

您可以通过DriverVersion属性以序数形式获取驱动程序版本,或者通过DRIVER_VER属性获取字符串(也可以包括驱动程序描述)。查询的SQL_DRIVER_VER信息类型在ODBC API中描述为:

  

SQL_DRIVER_VER(ODBC 1.0)

     

包含驱动程序版本的字符串,也可以是a   驱动程序的描述。该版本至少为##。##。####,其中前两位是主要版本,后两位是次要版本,最后四位是   发布版本。

使用FireDAC,你可以这样做:

uses
  FireDAC.Phys.ODBCWrapper;

procedure TForm1.Button1Click(Sender: TObject);
var
  DriverVerStr: string;
  DriverVerInt: TFDVersion;
  ODBCConnection: TODBCConnection;
begin
  ODBCConnection := TObject(FDConnection.CliObj) as TODBCConnection;

  DriverVerStr := ODBCConnection.DRIVER_VER;
  DriverVerInt := ODBCConnection.DriverVersion;

  Memo.Lines.Add(Format('DriverVerStr: %s', [DriverVerStr]));
  Memo.Lines.Add(Format('DriverVerInt: %d', [DriverVerInt]));
end;

2。获取驱动程序支持的ODBC版本

要使用已使用的驱动程序支持ODBC版本,您可以使用DriverODBCVersion属性获取序数值,或使用DRIVER_ODBC_VER获取字符串值。查询的SQL_DRIVER_ODBC_VER数据类型信息描述如下:

  

SQL_DRIVER_ODBC_VER(ODBC 2.0)

     

具有驱动程序支持的ODBC版本的字符串。   版本的格式为##。##,其中前两位是   主要版本和接下来的两位数是次要版本。   SQL_SPEC_MAJOR和SQL_SPEC_MINOR定义主要版本和次要版本   数字。对于本手册中描述的ODBC版本,这些是3   和0,驱动程序应返回" 03.00"。

使用FireDAC,你可以这样做:

uses
  FireDAC.Phys.ODBCWrapper;

procedure TForm1.Button1Click(Sender: TObject);
var
  ODBCVerStr: string;
  ODBCVerInt: TFDVersion;
  ODBCConnection: TODBCConnection;
begin
  ODBCConnection := TObject(FDConnection.CliObj) as TODBCConnection;

  ODBCVerStr := ODBCConnection.DRIVER_ODBC_VER;
  ODBCVerInt := ODBCConnection.DriverODBCVersion;

  Memo.Lines.Add(Format('ODBCVerStr: %s', [ODBCVerStr]));
  Memo.Lines.Add(Format('ODBCVerInt: %d', [ODBCVerInt]));
end;

3。获取驱动程序访问的DBMS产品的版本

您可以通过DBMS_VER属性获取访问过的DBMS产品版本。 ODBC API将查询的SQL_DBMS_VER信息类型描述为:

  

SQL_DBMS_VER(ODBC 1.0)

     

表示DBMS产品版本的字符串   由司机访问。版本的格式为##。##。####,其中   前两位是主要版本,接下来的两位数是   次要版本,后四位是发布版本。   驱动程序必须以此形式呈现DBMS产品版本,但可以   还附加了DBMS产品特定版本。例如,   " 04.01.0000 Rdb 4.1"。

使用FireDAC,您可以通过这种方式获取它(没有属性返回已解析的序号版本号,所以让我们自己尝试解析序数值):

uses
  FireDAC.Stan.Util, FireDAC.Phys.ODBCWrapper;

procedure TForm1.Button1Click(Sender: TObject);
var
  DBMSVerStr: string;
  DBMSVerInt: TFDVersion;
  ODBCConnection: TODBCConnection;
begin
  ODBCConnection := TObject(FDConnection.CliObj) as TODBCConnection;

  DBMSVerStr := ODBCConnection.DBMS_VER;
  DBMSVerInt := FDVerStr2Int(DBMSVerStr);

  Memo.Lines.Add(Format('DBMSVerStr: %s', [DBMSVerStr]));
  Memo.Lines.Add(Format('DBMSVerInt: %d', [DBMSVerInt]));
end;

4。获取FireDAC统一版本信息

FireDAC提供ClientVersionServerVersion属性,可通过连接对象的ConnectionMetaDataIntf接口属性访问。

对于ODBC驱动程序,ClientVersion属性返回驱动程序版本(此处的第1节中描述),如果驱动程序不是单层驱动程序,则返回DBMS产品版本(在第3节中描述)。对于ODBC驱动程序,ServerVersion总是返回DBMS产品版本(在此处的第3节中描述)。

例如:

procedure TForm1.Button1Click(Sender: TObject);
var
  Metadata: IFDPhysConnectionMetadata;
begin
  Metadata := FDConnection.ConnectionMetaDataIntf;
  try
    Memo.Lines.Add(Format('ClientVersion: %d', [Metadata.ClientVersion]));
    Memo.Lines.Add(Format('ServerVersion: %d', [Metadata.ServerVersion]));
  finally
    Metadata := nil;
  end;
end;