2

我有一个通过 LAN 部署的 Firebird 2.1.1 数据库。在最近的一次升级中,我使用了一个 FB 内部函数 (COALESCE)。当我在我的开发机器上测试我的 Delphi 应用程序时,没有任何问题。

但是当我尝试在生产机器上运行查询时,我收到一条错误消息,告诉我该功能 (COALESCE) 不可用。

Coalesce 是 FB 内置的内部函数。它不是 UDF 或存储过程,它是内置的。

问:为什么使用 Coalesce 的查询可以在我的开发机器上工作,但不能在生产机器上工作?

更多信息:

  • 两者都有 XP pro SP2
  • 我的程序是在 Delphi 3.0 中使用 BDE 开发的
  • 顺便说一句:我在工作站(生产机器)上安装了 FB 服务器,并且,瞧,使用 Coaclesce 的查询有效!我以为 Coaclesce 是一个内部函数?!我不想在每台机器上都安装 FB Server。在三个不同的地点有七十多个工作站。

通常我在一台运行 XP 的机器上安装了 FB (ver 2.1.1)。这是我指定的数据库服务器。运行我的应用程序的所有工作站都从该服务器获取数据。我升级了我的应用程序并更改了驻留在我的客户端应用程序使用的服务器上的 FB 数据库的架构。我所做的更改之一是我第一次使用 FB 内部函数。具体来说,我正在使用函数 COALESCE。当我在工作站上运行我的应用程序时,我收到以下错误消息: -SQL 错误代码 = -804 -Function unknown -COALESCE 在工作站上运行的应用程序正在对使用 COALESCE 的服务器上的数据库运行 select 语句。

这是有趣的部分:包含 COALESCE 的查询在我的开发机器(这是我们网络上的另一个工作站)上运行良好,但在我的用户工作站(生产机器)上运行良好。所以我问自己“我的开发计算机有什么不同?” 好吧,它上面有FB服务器。所以我在用户的工作站上安装了 FB 服务器(FB 现在在我们的服务器上 + 在运行我的应用程序的工作站上)并且:我不再收到错误了!我的应用程序仍在使用服务器的数据库(而不是工作站的数据库),但好像通过在客户端工作站上拥有完整的 FB 服务器,我的应用程序现在可以找到内部 FB 功能。

我一直假设 FB 内部功能是服务器安装的一部分。它们不需要复制到工作站,也不需要声明。它们就像 SUM、MIN、MAX 或 AVG。

问:为什么 Firebird 内部函数不能在 Firebird 客户端计算机上运行?

4

1 回答 1

2

Firebird 的客户端库“fbclient.dll”(或者可能重命名为“gds32.dll”)解析语句并验证所使用的 SQL 关键字。

不必在客户端机器上安装服务器。

所发生的事情是机器运行的是旧版本的客户端库(可能 BDE 已经分发了旧的“gds32.dll”),无法识别“COALESCE”关键字。当您安装服务器版本 2.1.1 时,它还会安装更新的客户端模块,并可能将系统目录中的旧“gds32.dll”替换为兼容的“fbclient.dll”(服务器安装程序中默认选中的选项) Firebird 2.1,重命名为“gds32.dll”。

您可以尝试重现问题,在工作站中搜索“fbclient.dll”和“gds32.dll”的所有副本,然后注意它们是否真的是旧版本,并尝试仅替换此特定文件,而不安装服务器在客户端机器中。

于 2012-05-25T04:53:29.733 回答