我有一个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
答案 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;