-1

首先,让我们举个例子:

你在 Delphi 中创建了一个新的 VCL 应用程序项目,然后输入一个TIBDataBase并输入带有扩展名的数据库文件的路径和名称,.IB好吗?

现在,如果您只是放置example.ib并留下路径,当您在没有 Delphi 的情况下执行应用程序时,如果.EXE.IB因为找不到数据库文件,因为Delphi更改了工作目录。

有时,您希望在开发Active时将该组件的属性设置为,而在应用程序启动期间,当您交付给客户时True,它们会设置并更改它。False所有这一切都是因为他/她可能希望安装在不同的路径中,并且您的应用程序必须在打开数据库之前找到数据库的正确位置。

当您已经交付给客户并且仍然每天对代码进行一些更改时,问题就出现了。然后,您必须每天至少部署一次,有时您只是忘记将该属性设置回False,当客户端收到更新并尝试运行它时,他/她会收到未找到的数据库错误。

问题是,如果在将组件加载到内存中并且数据库的激活没有在我自己的代码中发生时自动发生这种打开,我该如何处理该错误?

4

2 回答 2

2

我认为您不会找到一种通用解决方案来防止设计时属性设置中出现运行时异常,而无需修改组件或派生后代。

对于TIBDatabase,将属性设置AllowStreamedConnectedFalse。这会在设计时 停止TIBDataBase在运行时自动连接到数据库。即使在设计时设置为活动,使用它也不会打开。ConnectedTrueTIBQueryTIBDatabase

其他一些数据库连接组件具有类似的属性。

于 2013-04-30T02:14:53.633 回答
2

关于数据库问题:如果我理解正确,我的解决方案要求您为“BeforeConnect”事件编写事件处理程序,如下所示:

procedure TDM.SQLConnection1BeforeConnect(Sender: TObject);
var
 dir: string;

begin
 with TRegIniFile.create (regpath) do  // I keep my database locations in the registry
  begin                          // but you can use any method of getting the location
   dir:= ReadString ('firebird', progname, '');
   free
  end;

 with sqlconnection1 do
  begin
   close;
   params.values['database']:= dir;
   loginprompt:= false;
  end;
end;

这样,您可以将一个位置存储在数据库中以供本地使用,但为不同的用户提供不同的位置。

于 2013-04-30T03:22:39.590 回答