1

我可以通过以下命令使用 Firebird ISQL Tool (Firebird 3.0.4) 连接到我的 Firebird 数据库: connect "C:\Documents\database.db" user 'USER' password 'PASSWORD';

当我想在 Python 脚本(Windows10 64 位上的 Python v3.7.7)中,在包括 fdb v2.0.1 甚至 firebirdsql v1.1.3 的虚拟环境中执行此操作时,我不能并且系统地出现错误。

import fdb
con = fdb.connect(database="C:\Documents\database.db", user='USER' password='PASSWORD'')

DatabaseError: ('连接数据库时出错:\n- SQLCODE: -902\n- 无法完成对主机 "xnet://Global\FIREBIRD" 的网络请求。', -902, 335544721)

或者

con = fdb.connect(host='localhost', database="D:\Documents\database.db", user= 'USER' password= 'PASSWORD'')

DatabaseError: ('连接数据库时出错:\n- SQLCODE: -902\n- 无法完成对主机“localhost”的网络请求。\n- 建立连接失败。', -902, 335544721)

或者

con = fdb.connect(dsn="localhost:C:\Documents\database.db", user='USER' password='PASSWORD'')

DatabaseError: ('连接数据库时出错:\n- SQLCODE: -902\n- 无法完成对主机“localhost”的网络请求。\n- 建立连接失败。', -902, 335544721)

或者

import firebirdsql
con = firebirdsql.connect(host='localhost', database="D:\Documents\database.db", user='USER' password='PASSWORD'')

如果您有任何想法,欢迎您,因为我被卡住了。

4

1 回答 1

4

该错误表明fbclient.dllFDB 加载的不提供 Firebird Embedded,并且您的机器上没有运行 Firebird Server。

要解决这个问题,您必须:

  1. 启动 Firebird 服务器(通过启动它的服务或运行firebird -a
  2. 如果您想使用 Firebird Embedded 而不是 Firebird Server,请将 FDB 指向fbclient.dll提供 Firebird Embedded

第 2 点可以通过多种方式完成。在我的回答中,我假设使用安装在C:\Program Files\Firebird\Firebird-3.0.5.33220-0_x64. 从 Firebird 3 开始,正常的 Firebird 服务器安装也提供 Firebird Embedded。要指向 Firebird Embedded,您可以执行以下操作:

  1. 将 Firebird 安装目录添加到PATH环境变量中(确保它在/之前 列出)。在正常的 Firebird 安装中,没有 Firebird Embedded 安装在文件夹中,如果加载,您将无法使用 Firebird Embedded。%SystemRoot\System32C:\Windows\System32fbclient.dllSystem32
  2. 用于fdb.load_api加载客户端库:
    fdb.load_api('C:/Program Files/Firebird/Firebird-3.0.5.33220-0_x64/fbclient.dll')
    
    这需要在第一次使用之前完成fdb.connect,否则会使用通过正常搜索路径找到的库
  3. fb_library_name使用连接属性 指定客户端库:
    con = fdb.connect(dsn='C:/path/to/yourdatabase.fdb', user='sysdba', password='masterkey', 
        fb_library_name='C:/Program Files/Firebird/Firebird-3.0.5.33220-0_x64/fbclient.dll')
    
    需要在使用 FDB 建立的第一个连接上指定此属性。尽管该属性的存在表明这是“每个连接”,但 FDB 将始终使用加载的第一个客户端库(本质上,它就像您load_apiconnect.

如果您使用的是 Firebird 2.5 或更早版本,则需要下载特定的 Firebird 2.5 Embedded 包,并指向其fbembed.dll而不是fbclient.dll. 对于 Firebird 2.5 Embedded,将其位置添加到路径中将不起作用,除非您将其重命名或复制fbembed.dllfbclient.dll.

于 2020-06-07T12:02:15.227 回答