我有一个与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是空白的。
答案 0 :(得分: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;
要使用已使用的驱动程序支持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;
您可以通过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;
FireDAC提供ClientVersion和ServerVersion属性,可通过连接对象的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;