1

我有 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
4

1 回答 1

1

手头没有较旧的 Delphi 版本,但在 Delphi 10.3.2 中,ErrorCode用于 PostgreSQL 的设置为连接尝试时驱动程序返回的状态,并且值为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;
于 2019-11-10T12:04:57.980 回答