-2

我正在使用 Firebird 2.5(嵌入式)和 Delphi XE2。
我将以下文件保存到我的应用程序根目录:

  • C:\myapp\app.exe
  • C:\myapp\fbclient.dll
  • C:\myapp\icudt30.dll
  • C:\myapp\icuin30.dll
  • C:\myapp\icuuc30.dll
  • C:\myapp\dbxfb.dll

和我的连接设置:

procedure TMainForm.Button1Click(Sender: TObject);
var Con: TSQLConnection;
 begin
  Con := TSQLConnection.Create(Self); 
    With Con Do
     Begin
       Connected := False;
       DriverName := 'FirebirdConnection';

       Params.Clear;
       Params.Add('DriverName=' + DriverName);
       Params.Add('User_Name=SYSDBA');
       Params.Add('Password=masterkey');
       Params.Add('Database=C:\GHARARDAD.FDB');
       Params.Add('SQLDialect=3');

       LoginPrompt := False;
       ConnectionName := 'Gharardad';
       LibraryName := 'dbxfb.dll';
       VendorLib := 'C:\fbclient.dll'; // Renamed fbembed.dll to fbclient.dll
       GetDriverFunc := 'getSQLDriverInterBase'; 
       Connected := True;
     End;
    End;

我的操作系统是:Win 7 64 bit
FB embedde ver 是:Firebird-2.5.1.26351-0_Win32_embed

而且我的应用程序是在 32 位上编译的

DLL 大小:

 fbembed.dll  ----->  size    3,784,704 bytes

 dbxfb.dll     -----> size    288,768 bytes


但是当我想运行应用程序时,出现以下错误:

DBX 错误:驱动程序无法正确运行。客户端可能是错误的,未正确安装,错误的版本,或者驱动程序可能从系统路径中错误。


我究竟做错了什么?

4

4 回答 4

4
  1. 您需要像这样指定数据库参数:

    Params.Add('Database=C:\Full\Path\GHARARDAD.FDB');

  2. 我看到你想使用嵌入式版本,你需要使用fbembed.dll不是 fbclient.dll

于 2012-08-02T07:40:14.433 回答
2

如果您已经指定数据库 User_Name 密码,我不知道为什么要使用 ConnectionName。

我更喜欢这样的东西:

 Con := TSQLConnection.Create(Self); 
    With Con Do
     Begin
       Connected := False;
       DriverName := 'FirebirdConnection';      
       LibraryName := 'dbxfb.dll';
       VendorLib := 'fbembed.dll';
       ConnectionName := 'Gharardad';
       Params.Value['User_Name'] := 'SYSDBA';
       Params.Value['Password'] := 'masterkey';
       Params.Value['Database'] := 'C:\GHARARDAD.FDB';
       Connected := True;
     End;
于 2012-08-02T08:45:40.910 回答
1

你有任何其他连接到该数据库吗?

FlameRobin、IBExpert、Delphi IDE 表单设计器?

您在 Delphi 中有任何活动的数据集/连接吗?

嵌入式需要以不可共享方式打开文件。

运行 SysInternals Process Explorer 并搜索您的数据库文件(如果它已被其他应用程序打开)


你真的使用奇怪重命名的 firebird 嵌入式而不是 firebird 客户端吗?@Marcodor 和 @Re0sless 已经问过你了。

似乎您只认为您使用的是嵌入式,但您只安装了一小部分没有主机的服务器。

fbembed.dll   2.5.1   Win32   size is 3 784 704 bytes
fbclient.dll  2.5.1   Win64   size is 870 912 bytes
fbclient.dll  2.5.1   Win32   size is 548 864 bytes

哪个是你的 DLL?


这也可能是数据库引擎版本和数据库文件版本不匹配。尝试 SysInternals Process Monitor 以查看您的应用程序尝试查找和打开哪些文件。它是否成功打开数据库文件?它是否成功找到并打开 firebird.msg ?它是否成功打开 icu*.dll ?也许是udf dll?

是否有一些错误写入 firebird.log ?

一般来说 - 学习使用 SysInternals Process Monitor 来了解哪些文件以及在哪里尝试过。它经常会提示您究竟发生了什么错误以及原因。


您没有列出 fbintl.dll 如果您的数据库包含非拉丁字母和非英语语言,那么如果没有正确定位 fbintl,它可能无法打开它。在 Process Monitor 中检查它被搜索并放在那里的位置。


检查进程监视器您的应用程序实际加载的 firebird dll 版本。它的版本是否足够新以打开该数据库?

于 2012-08-02T08:15:18.600 回答
1

您说您使用的是嵌入式 Firebird,但您使用的是标准的 Firebird VendorLib

VendorLib := 'fbclient.dll';

对于嵌入式火鸟,这应该是

VendorLib = '[pathtolib]\fbembed.dll'

您还缺少 GetDriverFunc 的值

所以完整的 TSQLConnection 对象看起来像这样(在 Delphi 2007 中测试)

Con := TSQLConnection.Create(Self); 
With Con Do
 Begin
   Connected := False;
   DriverName := 'FirebirdConnection';

   Params.Clear;
   Params.Add('DriverName=' + DriverName);
   Params.Add('User_Name=SYSDBA');
   Params.Add('Password=masterkey');
   Params.Add('Database=C:\GHARARDAD.FDB');
   Params.Add('SQLDialect=3');
   //other connection params here

   ConnectionName := 'Gharardad';
   LibraryName := 'dbxfb.dll';
   VendorLib := 'C:\fbembed.dll';
   GetDriverFunc = 'getSQLDriverInterBase' //Or what ever the dbxfb.dll function is called
   Connected := True;
 End;
End;

请注意,getSQLDriverInterBase 函数是 Devart firebird 库中函数的名称,因此它在 dbxfb.dll 库中可能有所不同。

于 2012-08-02T08:23:28.230 回答