我无法让firebird嵌入式服务器工作。
在第
行获取例外datamodule1.IBQuery1.Prepare;
" .exe引发了一个EIBClientError,其中包含消息'数据库名称丢失'。"
(IBQuery1与IBDatabase1相关联)
我正在使用此软件包中的server / client dll: Firebird-2.5.3.26778-0_Win32_embed.zip(x86)
我将以下文件(如firebird手册中所述)复制到我的应用程序文件夹中:
(' firebird.conf'不需要复制,以防你使用firebirds默认配置。)
我将fbembed.dll重命名为gds32.dll,因为我正在使用Delphi的interbase组件,但也尝试了文件名fbclient.dll和fbembed.dll。
对于IBDatabase1' DatabaseName'属性我不使用主机名bacause它在手册中说明,你不必使用嵌入式服务器(本地XNET协议)。 我在运行时创建路径,调试它并双重检查路径,它是正确的。
在设计时,我可以连接到数据库,设置IBDatabase1'已连接'参数为' True'。 (在使用正确的路径手动填充' DatabaseName'属性后。)
我在系统中搜索了其他firebird客户端dll(gds32.dll),并在四个不同的位置找到了它:
似乎系统使用的是位于SysWOW64的系统,但即使我将dll替换为嵌入式(fbembed.dll重命名为gds32.dll),也没有任何变化。
目标不是触及任何已安装的dll和环境变量/注册表项,而是使用与我的应用程序捆绑在一起的嵌入式dll并位于其旁边,因此使软件的部署变得如此简单你可以得到。
更多信息:
正在搜索类似的主题,但我找不到解决方案。
连接数据库:
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;
答案 0 :(得分:1)
好的,这就是问题所在。
IBDatabase1 := TIBDatabase.Create(self);
它完全是针,因为类实例已经由数据模块'form'创建。
我感到惭愧,抱歉......