Firebird 2.5嵌入式 - '数据库名称缺失' - 客户端dll混乱

时间:2014-08-05 09:49:49

标签: delphi dll firebird

我无法让firebird嵌入式服务器工作。

在第

行获取例外
datamodule1.IBQuery1.Prepare;

" .exe引发了一个EIBClientError,其中包含消息'数据库名称丢失'。"

(IBQuery1与IBDatabase1相关联)

我正在使用此软件包中的server / client dll: Firebird-2.5.3.26778-0_Win32_embed.zip(x86)

我将以下文件(如firebird手册中所述)复制到我的应用程序文件夹中:

  • ib_util.dll
  • icudt30.dll
  • icuin30.dll
  • icuuc30.dll
  • fbembed.dll
  • firebird.msg

(' firebird.conf'不需要复制,以防你使用firebirds默认配置。)

我将fbembed.dll重命名为gds32.dll,因为我正在使用Delphi的interbase组件,但也尝试了文件名fbclient.dll和fbembed.dll。

对于IBDatabase1' DatabaseName'属性我不使用主机名bacause它在手册中说明,你不必使用嵌入式服务器(本地XNET协议)。 我在运行时创建路径,调试它并双重检查路径,它是正确的。

在设计时,我可以连接到数据库,设置IBDatabase1'已连接'参数为' True'。 (在使用正确的路径手动填充' DatabaseName'属性后。)

我在系统中搜索了其他firebird客户端dll(gds32.dll),并在四个不同的位置找到了它:

  • c:\ Program Files(x86)\ HK-Software \ IBExpertLive \ gds32.dll
  • C:\ Windows \ System32下\ gds32.dll
  • C:\的Windows \ Syswow64资料\ gds32.dll
  • c:\ InCash \ GDS32.DLL

似乎系统使用的是位于SysWOW64的系统,但即使我将dll替换为嵌入式(fbembed.dll重命名为gds32.dll),也没有任何变化。

目标不是触及任何已安装的dll和环境变量/注册表项,而是使用与我的应用程序捆绑在一起的嵌入式dll并位于其旁边,因此使软件的部署变得如此简单你可以得到。

更多信息:

  • 尝试将数据库XYZ.FDB重命名为XYZ.GDB
  • 用户名和密码在IBDatabase1' Params'虽然没有必要使用嵌入式版本
  • 运算。 system:Win7 x64
  • 我安装了firebird服务,但已经停止了
  • 我正在使用Delphi的InterBase组件
  • Datamodule1.IBQuery1与Datamodule1.IBDatabase1
  • 绑定
  • IBDatabase1的DatabaseName属性已设置为' e:\ X \ XYZ.FDB'按代码(路径正确,我仔细检查)
  • IDE:Delphi 2010

正在搜索类似的主题,但我找不到解决方案。

连接数据库:

procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
  IBDatabase1 := TIBDatabase.Create(self);
  //
  app_path := ExtractFilePath(Application.ExeName);
  //
  IBDatabase1.DatabaseName := app_path + 'db\XYZ.GDB';
  IBDatabase1.LoginPrompt := false;
  IBDatabase1.Params.add('lc_ctype=UTF8');
  IBDatabase1.Params.add('user_name=xyz'); //not necessary with embedded
  IBDatabase1.Params.add('password=xyz'); //not necessary with embedded
  //
  IBDatabase1.Connected := true;
  IBDatabase1.Open;
end;

然后尝试插入记录:

  with datamodule1.IBQuery1 do
  begin
    close; 
    With SQL do
    begin
      clear; 
      Add( 'INSERT INTO MST_EVENTS (index, state, event, param, date, time, devID, gateway)' );
      Add( 'VALUES :index, :state, :event, :param, :date, :time, :devid, :gateway');
    end;
    //
    Params[0].AsInteger := FMaster.EventRecordIndex; 
    Params[1].AsSmallInt := FMaster.EventRecordState; 
    Params[2].AsString := eventToStr(FMaster.EventRecordEvent);          
    Params[3].AsSmallInt := 0;
    Params[4].AsDate := FMaster.EventRecordDate; 
    Params[5].AsTime := FMaster.EventRecordTime; 
    Params[6].AsLongWord := FMaster.EventRecordDevID; 
    Params[7].AsString := FMaster.EventRecordIP; 
    //
    if ( prepared = false ) then
      prepare;  //Throws the exception here
    open; 
  end;

1 个答案:

答案 0 :(得分:1)

好的,这就是问题所在。

IBDatabase1 := TIBDatabase.Create(self);

它完全是针,因为类实例已经由数据模块'form'创建。

我感到惭愧,抱歉......