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

Posted

技术标签:

【中文标题】如何找到用于 FireDac 连接的 MS Access 版本和/或 dll 名称?【英文标题】:How can I find the MS Access version and/or dll name used for a FireDac connection? 【发布时间】:2017-02-22 22:18:25 【问题描述】:

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

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

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

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

我知道我可以在打开我的连接之前在物理连接链接上指定一个 VendorLib。我不想那样做。我希望 FireDac 通过它的过程来查找和使用系统上最相关的驱动程序。但是,一旦完成,我想知道它最终使用的是什么驱动程序。

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

【问题讨论】:

【参考方案1】:

1。获取驱动版本

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

SQL_DRIVER_VER (ODBC 1.0)

带有驱动程序版本的字符串,以及可选的 司机的描述。版本至少为 ##.##.#### 形式,其中前两位数字是主要版本,接下来的两位数字是次要版本,最后四位数字是 发布版本。

使用 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 节中描述)。 ServerVersion 始终返回 ODBC 驱动程序的 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;

【讨论】:

这些属性似乎返回驱动程序实现的 ODBC 版本,而不是驱动程序本身的版本。现在,我可以在用于 Access 的 ODBC 管理工具中看到两个驱动程序。一个是版本 10.00.15063,另一个是 14.00.7010。当我在我的连接上运行您的代码时,我得到以下信息: DRIVER_VER: Microsoft Access 数据库引擎 DRIVER_ODBC_VER: 03.51 DriverVersion: 0 DriverODBCVersion: 351000000 我希望 DRIVER_VER 将是 CLI 版本。至少应该是。 DRIVER_ODBC_VER 应该报告支持的 ODBC 版本。好吧,该驱动程序中的SQL_DRIVER_VER 信息类型实施不当。那样的话,嗯,也许检查驱动库的版本? 已更新。我试图涵盖您可能感兴趣的版本信息。我想这是您正在寻找的 DBMS 产品信息(至少您的标题是 “我如何找到 MS Access 版本”,对不起,我错过了)。为什么驱动程序版本为您使用的驱动程序返回 ODBC API 指定的其他内容仅仅是因为错误的实现(如果有人而不是 “至少,版本的形式是 ##.##.####” 返回“Access数据库引擎”,不值一提:) 我需要卸载我的旧驱动程序并检查一些版本号,看看有什么变化。你确实给了我一个关于去哪里的想法。由于 Access 返回的内容,我将使用 OdbcConnection.DRIVER_NAME 属性。那给我aceodbc.dll。然后我可以从 dll 中读取版本号。这让我得到了我期望看到的版本。感谢您的详细帖子。 我对自己所做的事情没有给予足够的关注。我试图在指针上使用“is”。我需要:如果 TObject(FDConnection.CliObj) 是 TODBCConnection 那么......现在工作得很好。谢谢!

以上是关于如何找到用于 FireDac 连接的 MS Access 版本和/或 dll 名称?的主要内容,如果未能解决你的问题,请参考以下文章

FireDAC 优势数据库连接类型

msgpack配合FIREDAC传输多表数据

带有 MS Access 2010 数据库的 Delphi FireDAC。为啥它将 ACE 转换为 Jet?

(FireDAC) 连接定义

如何将字符串插入 sQlite.sdb (FireDac)?

Delphi - FireDAC的连接配置