FireDAC“无法完成对主机的网络请求”

时间:2018-06-27 19:21:27

标签: delphi firebird firedac isapi

完整的错误文本为远程错误:[FireDAC] [Phys] [FB]无法完成对主机“ dataserver16”的网络请求。将数据写入连接时出错。现在看来,其他人遇到了这个问题,然后他们对它进行了整理,就消失了,但是我偶尔会遇到这个问题。

包含FireDAC Firebird连接的My Datasnap ISAPI.dll在与托管数据库(dataserver16)所在但位于同一子网上的另一台机器上的IIS服务器上运行。我知道所有配置都正确,因为 该应用程序可以在大约70%的时间内正常运行 !其他30%的时间,我的Datasnap客户端收到此错误(从dll传回)。

2 个答案:

答案 0 :(得分:2)

恕我直言,看来是网络问题。如果建立了连接,并且您可以对此连接进行读写数据,则表明连接正确。

您是否尝试过从源系统到目标进行Ping并记录该Ping,以便可以查看与服务器的连接是否消失?

以管理员身份打开Commandwindow并输入:

Ping {TARGET} -t >> c:\ping.log

然后等到错误消失,然后检查日志文件(如果您的目标在“时间”可用)。

要获得更多帮助,我们需要更多背景信息,例如Firebird版本或如果您能够重现错误+源代码,则如何设置连接。

答案 1 :(得分:1)

为了完整起见,我在这里发布我的解决方案。也许其他人将从这个答案中受益。解决方案是执行Firebird连接的重试。我这样做的方法是,每个TSQLQuery的BeforeOpen事件处理程序都连接到相同的方法。这极大地提高了可靠性(即使它放慢了一点)。 FireDAC的代码与此类似。 DBX和FireDac在这里都可以很好地工作。

const
   retrycount = 3;

procedure TServerMethodsDBX.QueryBeforeOpen(DataSet: TDataSet);
begin
  TryConnect(TSQLQuery(DataSet).SQLConnection);
  // ...
end;

procedure TServerMethodsDBX.TryConnect(SQLConn: TSQLConnection);
var
  i: Integer;
  Error: String;
begin
  i := 0;
  SQLConn.Close;
  while (not SQLConn.Connected) and (i < retrycount) do
  begin
    try
      SQLConn.Connected := True
    except
    on e: exception do
    begin
      Error := Error + ' ' + e.Message;
      Sleep(500);
      Inc(i);
    end;
    end;
  end;
  if i = retrycount then
    LogMessage('Tryconnect error: ' + Error);
end;