【发布时间】: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,也不是这个组件,所以我不能肯定)