使用 FireDAC 连接到嵌入式 Firebird 2.5

Posted

技术标签:

【中文标题】使用 FireDAC 连接到嵌入式 Firebird 2.5【英文标题】:Connect to Firebird 2.5 embedded using FireDAC 【发布时间】:2014-10-10 01:36:12 【问题描述】:

无论我做什么,我似乎都无法使用 FireDAC 连接到 Firebird 2.5 嵌入式数据库。有趣的是,昨天它似乎可以工作,现在突然就不行了。

与其想知道为什么它突然停止工作,我开始重建一个干净的项目,这样我就可以一步一步弄清楚发生了什么。我将从 Firebird 下载的包的全部内容添加(复制)到我的应用程序目录和数据库本身。

为避免文件夹问题,我设置了 Delphi 环境选项以将所有文件(和 exe)放在同一目录中。然后我使用在 Firebird *.doc 文件夹中找到的建议并将 fbembed.dll 重命名为 fbclient.dll。 (在一些关于我读到 Firedac 需要 fbembed.dll 文件的问题的 FireDAC Q&A 中。好吧,我已经尝试了两种方法,但无论如何它都不起作用)。但让我坚持 fbclient.dll 的第一个问题。

为了建立连接,我在数据模块上放置了一个 FDPhysFBDriverLink1 和一个 FDConnection1。

现在 FDPhysFBDriverLink1:它的 BaseDriverID 是 FB。对于 DriverID,我尝试了两个建议:首先使用“FB”,然后提供 fbclient.dll 的完整路径。似乎没有任何区别。

当我转到 Firedac 连接编辑器并输入我的数据库文件的路径时,我收到“无法加载供应商库(fbclient.dll 或 fbembed.dll)”错误。但是这两个文件都在应用程序 exe 文件夹中(就像 Embarcadero 网站上建议的那样)。那么,FireDAC 在哪里寻找文件?我对 Firebird 和 FireDAC 有点厌倦了,因为它们不能简单地解释必须做什么才能使连接成功。他们给出的只是一些模糊的选项,它们都不起作用。加这个加那个,最后失败。

因此,如果有人对如何通过直接的答案来做到这一点有经验(请不要链接,我已经看过并尝试过所有链接),我将非常感激。尝试几天建立一个简单的连接真的很愚蠢。我也尝试过使用 UniDAC 获得类似的结果。我必须做什么才能完成连接?

【问题讨论】:

我无法立即放置它,但 ISTR 几周前这里有一个关于 Firebird 嵌入式突然停止工作的问题。如果有人想出答案,您可以尝试寻找它。 【参考方案1】:

Firebird 是一个客户端-服务器系统 - 它具有服务器部分(fbserver.exe 或 fb_inet_server.exe)和客户端部分(fbclient.dll)。因此,当您连接到 Firebird 的普通(非嵌入式)实例时,您应该将 fbclient.dll 指定为客户端库。

Embedded Firebird 是服务器和客户端在单个 dll 中的组合 - 它们都被编译成 fbembed.dll(您可以查看它的大小并与 fbclient.dll 进行比较)。

当您使用嵌入式服务器时,您需要将 fbembed.dll 指定为客户端库,这样一来,您的代码中就会嵌入 Firebird 服务器(即代码,负责处理 SQL 查询)。

如果您未在 FireDAC 中指定供应商库,它将尝试加载第一个可用的 dll,这很可能是 fbclient.dll(来自 System32?)。

FireDAC 以及任何其他客户端组件不了解您正在使用的 Firebird 的体系结构 - 它只是加载指定的 dll 并调用其 API。它提供了极大的灵活性 - 您可以连接到 Embedded,或 SuperServer/Classic/SuperClassic 实例,只需更改客户端库(并调整连接字符串)。

很明显,但仍然很重要的一点是 - Embedded 不能用于远程连接(连接字符串如下:severname:Disk:\Path\Database.fdb)。

【讨论】:

【参考方案2】:

问题似乎是这样的: FDPhysFBDriverLink1 需要此信息:

BaseDriverID=FB
DriverID=FB 
VendorLib=C:\Users\***\Documents\Delphi\FIREBIRD\fbembed.dll

设置后,我可以使用这些参数连接 FDConnection1:

DriverID=FB
Database=C:\Users\***\Documents\Delphi\FIREBIRD\MYDB.FDB
User_Name=sysdba
Password=masterkey 
Protocol=local

【讨论】:

经过数小时尝试各种组合后,我终于走运了。但是,尽管它有效,我仍然对此感到不安。 为什么您对这个解决方案感到不安?使用 Firebird 嵌入式 - 可能 - 不是大多数人使用 Firebird 服务器的默认设置。默认情况下,它将查找普通客户端库 (fbclient.dll),因此您需要明确指示它使用(以及在哪里找到)fbembed.dll(与 fbclient.dll 具有相同的 API,但也包含服务器)。

以上是关于使用 FireDAC 连接到嵌入式 Firebird 2.5的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串插入 sQlite.sdb (FireDac)?

Delphi:FireDac 连接阻止应用程序

Spring JMS - 无法使用嵌入式代理连接到代理 URL

使用 Java 连接到嵌入式 OrientDB 服务器

Apache Drill - 以嵌入式模式连接到 Drill [java]

如何将 HSQL DB Manager 连接到嵌入式数据库