Есть ли какие-либо изменения в отображении кода ошибки исключения FireDAC EFDDBEngineException для PostgreSQL?

У меня есть приложение 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

person Deepak kumar jain    schedule 11.07.2019    source источник


Ответы (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;
person TLama    schedule 10.11.2019