我有一个通过 LAN 部署的 Firebird 2.1.1 数据库。在最近的升级中,我使用了 FB 内部函数 (COALESCE)。当我在我的开发机器上测试我的 Delphi 应用程序时,没有出现任何问题。
但是当我尝试在生产计算机上运行查询时,我收到一条错误消息,告诉我该函数 (COALESCE) 不可用。
Coalesce是FB中内置的内部函数。它不是 UDF 或存储过程,它是内置的。
问:为什么使用 Coalesce 的查询可以在我的开发计算机上运行,但不能在生产计算机上运行?
更多信息:
- 两者皆为 XP pro SP2
- 我的程序是使用BDE在Delphi 3.0中开发的
- 顺便说一句:我在工作站(生产机器)上安装了 FB 服务器,你瞧,使用 Coaclesce 的查询工作正常了!我以为 Coaclesce 是一个内部函数?!我不想在每台机器上安装 FB Server。三个不同地点有 70 多个工作站。
通常我在一台运行 XP 的机器上安装了 FB(版本 2.1.1)。这是我指定的数据库服务器。运行我的应用程序的所有工作站都从该服务器获取数据。我升级了我的应用程序并更改了客户端应用程序使用的驻留在我的服务器上的 FB 数据库的架构。我所做的改变之一是我第一次使用 FB 内部函数。具体来说,我正在使用函数 COALESCE。当我在工作站上运行我的应用程序时,我收到以下错误消息: -SQL错误代码=-804 - 功能未知 -合并 在工作站上运行的应用程序正在对使用 COALESCE 的服务器上的数据库运行 select 语句。
这是有趣的部分:包含 COALESCE 的查询在我的开发计算机(这是我们网络上的另一个工作站)上运行良好,但在我的用户工作站(生产计算机)上运行良好。所以我问自己“我的开发计算机有什么不同?”嗯,它上面有 FB 服务器。因此,我在用户的工作站上安装了 FB 服务器(FB 现在位于我们的服务器上 + 运行我的应用程序的工作站上)并且:我不再收到错误了!我的应用程序仍在使用服务器的数据库(而不是工作站的数据库),但就好像通过在客户端工作站上拥有完整的 FB 服务器,我的应用程序现在可以找到内部 FB 功能。
我一直假设 FB 内部功能是服务器安装的一部分。它们不需要复制到工作站,也不需要声明。它们类似于 SUM、MIN、MAX 或 AVG。
问:为什么 Firebird 内部函数不能在 Firebird 客户端计算机上运行?
最佳答案
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”的所有副本,然后注意它们是否确实是旧版本,并尝试仅替换此特定文件,而不是在客户端计算机上安装服务器。
关于sql - Firebird SQL Server 内部函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10666556/