我正在编写一个 .net 应用程序,它连接到托管在 Internet 上的远程数据库服务器以进行某种复制。
数据库源在我本地的 firebird 服务器上,目标数据库在 Internet 上托管的 Firebird 服务器上
这是查询
execute block as DECLARE panum INT; DECLARE nom varchar(50); DECLARE prenom
varchar(50); DECLARE dna date; DECLARE datemodif date; DECLARE VARIABLE VSQL
VARCHAR(500); begin VSQL = 'select panum, nom, prenom, dna, DATEMODIF from
patient where (datemodif is not null) and (datediff (day from current_date
to cast(DATEMODIF as date)) >= 0) ';
FOR execute statement VSQL ON EXTERNAL DATA SOURCE
'127.0.0.1:C:\BDD\D2018.gdb'
AS USER 'sysdba' PASSWORD 'masterkey' INTO :panum, :nom, :prenom, :dna,
:DATEMODIF DO
merge into patient bb using (select :panum panum, :nom nom, :prenom prenom,
:dna dna, :DATEMODIF datemodif from RDB$DATABASE ) n on bb.panum = n.panum
when matched
then update set bb.nom = :nom, bb.prenom = :prenom, bb.dna = :DNA,
bb.DATEMODIF = :DATEMODIF when not matched
then insert(panum, nom, prenom, dna, datemodif) values(:panum, :nom,
:prenom, :dna, :datemodif);
suspend; end;
两台服务器都在 Windows 64 计算机上运行 Firebird 3.0.3。
它失败并显示此错误消息:
尝试打开文件 12515659 时出错:系统找不到指定的路径。数据来源:Firebird::127.0.0.1:C:\BDD\D2018.gdb
我也试过 localhost 和我的本地 ip 地址以及服务器名称。
如果我翻转方向,那么我的源数据库是远程服务器,目标是我的本地服务器,它就可以工作。
我知道这有点奇怪,但我对这样做有一些限制。
如果我从你的评论中理解正确,执行块是在外部服务器上执行的,它需要从本地服务器查询数据。
您的代码的问题 - 据我所知 - 是您似乎认为 IP 地址是从启动执行的进程的角度解析的(因此 127.0.0.1 将是您的本地数据库)。不是,地址解析是从进程执行的角度来看的
execute block
(在本例中:外部服务器上的 Firebird 进程,所以 127.0.0.1 就是那个外部服务器)。您需要将 127.0.0.1 替换为本地服务器的 IP 地址才能正常工作。此 IP 地址应该是公共的,或者至少可以从外部服务器访问。
但请注意,如果您将本地和外部服务器都暴露给公共互联网,那将存在安全风险。考虑使用 VPN 连接本地和外部服务器。