Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何找到用于FireDac连接的MS Access版本和/或dll名称?_Delphi_Firedac_Delphi 10.1 Berlin - Fatal编程技术网

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

Delphi 如何找到用于FireDac连接的MS Access版本和/或dll名称?,delphi,firedac,delphi-10.1-berlin,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驱动程序。我们希望检测到这种情况并提醒用户,以便他们可以安装新的驱动程序 我如何

我与Microsoft Access数据库有FireDac连接。我正在连接上配置Parms,如下所示:

Connection.Params.Add('DriverID=MSAcc');
Connection.Params.Add('Database=' + FDatabasePath);
Connection.Connected := true;
一般来说,这很有效。但是,在某些情况下,会安装旧的MS Access驱动程序。我们希望检测到这种情况并提醒用户,以便他们可以安装新的驱动程序

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

我知道我可以在打开我的连接之前在Phys连接链接上指定一个VendorLib。我不想那样做。我希望FireDac通过它的过程找到并使用系统上最相关的驱动程序。然而,一旦这样做了,我想知道它最终使用了什么驱动程序

在连接打开后,我尝试创建一个TFDPhysmAccess DriverLink,希望设置实际的DriverId或VendorLib属性。但是,ActualDriverId是MsAcc,VendorLib是空的。

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

SQL驱动程序版本(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;
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;
2.获取驱动程序支持的ODBC版本 要获取所用驱动程序支持的ODBC版本,可以使用属性获取序号值或字符串值。查询到的数据类型信息描述如下:

SQL\u驱动程序\u ODBC\u版本(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
  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;
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产品版本。ODBC API将查询的信息类型描述为:

SQL\U DBMS版本(ODBC 1.0)

表示DBMS产品版本的字符串 由驱动程序访问。该版本的格式为###########,其中 前两位为主要版本,后两位为 次要版本,最后四位数字为发布版本。 驱动程序必须以这种形式呈现DBMS产品版本,但可以 还要附加DBMS产品特定的版本。例如 “04.01.0000 Rdb 4.1”

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

4.获取FireDAC统一版本信息 FireDAC提供可通过连接对象的接口属性访问的和属性

对于ODBC驱动程序,如果驱动程序不是单层驱动程序,则属性返回驱动程序版本(在这里的第1节中描述),否则返回DBMS产品版本(在第3节中描述)。返回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版本,而不是驱动程序本身的版本。现在我可以在我的ODBC管理工具中看到两个用于访问的目录。一个是版本10.00.15063,另一个是版本14.00.7010。当我在我的连接上运行您的代码时,我得到以下信息:驱动程序版本:Microsoft Access数据库引擎驱动程序ODBC版本:03.51驱动服务器版本:0驱动程序版本:351000000我希望
驱动程序版本将是CLI版本。至少应该是这样。驱动程序ODBC版本应报告支持的ODBC版本。嗯,该驱动程序中的信息类型执行得很差。在这种情况下,嗯,也许可以检查驱动程序库的版本?更新。我试着介绍您可能感兴趣的版本信息。我猜您正在寻找的是DBMS产品信息(至少您的标题是“我如何找到MS Access版本”,很抱歉我错过了)。为什么对您使用的驱动程序返回ODBC API指定以外的驱动程序版本仅仅是因为错误的实现(如果有人返回“Access数据库引擎”,而不是“至少,该版本的格式为##.#.#.#.#.#.#”则不值得评论:)我需要卸载我的旧驱动程序,并检查一些版本号,看看有什么变化。不过你确实给了我一个方向的想法。由于访问返回的内容,我将使用OdbcConnection.DRIVER\u NAME属性。这给了我aceobc.dll。然后我可以从dll中读取版本号。这就是我希望看到的版本。谢谢你的详细帖子。我没有对我正在做的事情给予足够的关注。我试图在指针上使用“是”。我需要:如果TObject(FDConnection.CliObj)是todbconnection,那么。。。现在工作得很好。非常感谢。