【问题标题】:Firebird 2.5 embedded - 'Database name is missing' - client dll chaosFirebird 2.5 嵌入式-“缺少数据库名称”-客户端 dll 混乱
【发布时间】:2014-08-05 09:49:49
【问题描述】:

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

在行获取异常

datamodule1.IBQuery1.Prepare;

".exe 引发异常类 EIBClientError 并带有消息“缺少数据库名称”。"

(IBQuery1 绑定到 IBDatabase1)

我正在使用此包中的服务器/客户端 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

(如果您对 firebirds 默认配置没问题,则不必复制“firebird.conf”。)

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

对于 IBDatabase1 的“DatabaseName”属性,我不使用主机名,因为它在手册中说明在使用嵌入式服务器(本地 XNET 协议)的情况下您不必这样做。 我在运行时创建了路径,一直在调试它并仔细检查了路径,它是正确的。

在设计时,我可以连接到数据库,将 IBDatabase1 的“Connected”参数设置为“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' 属性中给出,但嵌入式版本不是必需的
  • 同上。系统:Win7 x64
  • 我安装了 firebird 服务,但它已停止
  • 我正在使用 Delphi 的 InterBase 组件
  • Datamodule1.IBQuery1 绑定到 Datamodule1.IBDatabase1
  • IBDatabase1 的 DatabaseName 属性已通过代码设置为“e:\X\XYZ.FDB”(路径正确,我仔细检查了)
  • IDE:德尔福 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;

【问题讨论】:

  • 错误信息不是来自Firebird(Firebird没有错误“Database name is missing”),所以我认为问题实际上与嵌入式 Firebird 的使用,或者它加载的客户端库。这更有可能是您使用的组件的错误。 This建议您需要显式打开数据库连接以避免错误。
  • 您可能还想显示用于连接的代码和实际属性值。我还发现您使用 DatabaseName 属性做什么(或不做什么)非常令人困惑。
  • @MarkRotteveel 好的,我在问题中输入了一些代码。
  • 我想知道设置IBDatabase1.Connected := true; 是否正确:我希望由于调用Open 而自动设置为true(但是:我不知道Delphi,也不是这个组件,所以我不能肯定)

标签: delphi dll firebird


【解决方案1】:

这行是问题所在。

IBDatabase1 := TIBDatabase.Create(self);

完全没有必要,因为类实例已经由数据模块'form'创建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多