EFDDBEngineException错误代码-错误代码映射是否有任何更改

时间:2019-07-11 12:47:04

标签: postgresql-9.4 firedac delphi-10.3-rio

我有一个Delphi XE7应用程序,它使用Postgres作为后端,并使用Firedac进行数据库连接。当名称为'db_name'的数据库不存在时,Delphi XE 7代码将生成一个EFDDBEngineException类异常。

此异常的类型为ekOther,错误代码为0。

// E.Kind  and E.ErrorCode
EFDDBEngineException

但是,当我将此应用程序迁移到Delphi 10.3.1时,错误代码现在返回1。在Delphi 10.3.1发行文档中找不到对该更改的任何引用。

我的问题是:更改Delphi 10.3.1代码以检查错误代码1而不是0是否安全?

// Delphi XE 7 code
if (E.Kind = ekOther) and (E.ErrorCode = 0) then begin

1 个答案:

答案 0 :(得分:0)

没有手工的旧版本的Delphi,但是在Delphi 10.3.2中,PostgreSQL的ErrorCode设置为尝试进行连接时驱动程序返回的状态,其值为CONNECTION_BAD (声明为值1的常量),如果尝试失败(由PQstatus函数调用返回)。

但是,由于任何类型的尝试连接失败的原因,都会返回此CONNECTION_BAD状态,而获取有关此类失败的详细信息的唯一方法(即使是PostgreSQL 12)也是检查错误消息(FireDAC就是这种情况)正在设置相关属性,例如您正在测试的Kind属性。

也就是说,要知道连接尝试是否由于不存在的数据库原因而失败,您必须分析错误消息。测试您不能保证这种特定的失败。

由于我没有手工的较早版本的Delphi,所以我无法回答您的问题,但是对于最新版本的Delphi,您可以按如下所示修改代码(但正如我上面所说,它不能保证对非现有数据库故障):

uses
  FireDAC.Phys.PGCli;

...
try
  FDConnection1.Open;
except
  on E: EPgNativeException do // or just EFDDBEngineException
    if (E.Kind = ekOther) and (E.ErrorCode = CONNECTION_BAD) then
      // connection attempt failed somehow, for details inspect the error message
end;