Lazarus+MySQL+ZeosDBO. Обработка ошибок

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
voltron
новенький
Сообщения: 64
Зарегистрирован: 06.07.2007 13:27:46
Откуда: Украина

Lazarus+MySQL+ZeosDBO. Обработка ошибок

Сообщение voltron »

Только начинаю осваивать взаимодействие в Lazarus и БД. Поэтому сразу прошу прощения, если мой вопрос покажется глупым.
Использую Lazarus 0.9.20 (fpс 2.0.4), MySQL 5.0.31 и последнюю версию ZeosDBO 6.6.1 beta. Нужно в программе обрабатывать и показывать пользователю сообщения об ошибках, выдаваемые сервером. Например, у меня есть пользовательская функция, которая генерирует ошибку с заданным текстом, как текст и код ошибки получить в программе?
Я пробовал использовать

Код: Выделить всё

try
 ZQuery.ExecSQL;
except
 on E:EZSQLThrowable do
  MsgBox(E.Message,'Error');
  // или MsgBox(E.ErrorCode,'Error');
 end;

но это не срабатывает. На сервере происходит ошибка, но сообщение об ошибке не появляется.
В чем моя ошибка? Где можно что-то почитать по этому вопросу?
Буду признателен за любую помощь.
voltron
новенький
Сообщения: 64
Зарегистрирован: 06.07.2007 13:27:46
Откуда: Украина

Сообщение voltron »

Проблема решилась. Правда частично.
Для перехвата и обработки ошибок нужно использовать конструкцию

Код: Выделить всё

try
 ZQuery.ExecSQL;
except
  on E:EZSQLException do
    begin
     //тут обрабатываем ошибку
    end;
  end;


Но есть одна фича - таким образом перехватываются только "стандартные" ошибки сервера. Если же используется пользовательская функция MySQL для генерации ошибок (например, для выхода из триггера. см. тут) то нужно внести изменения в код Zeos (спасибо dhongu из форума Zeos)
Нужно в модуле ZDbcMySqlUtils в процедуре CheckMySQLError заменить And на OR

Код: Выделить всё

procedure CheckMySQLError(PlainDriver: IZMySQLPlainDriver;
  Handle: PZMySQLConnect; LogCategory: TZLoggingCategory; const LogMessage: string);
var
  ErrorMessage: string;
  ErrorCode: Integer;
begin
  ErrorMessage := Trim(StrPas(PlainDriver.GetLastError(Handle)));
  ErrorCode := PlainDriver.GetLastErrorCode(Handle);
  if (ErrorCode <> 0) OR (ErrorMessage <> '') then    //  <-------------
  begin
    if SilentMySQLError > 0 then
      raise EZMySQLSilentException.CreateFmt(SSQLError1, [ErrorMessage]);

    DriverManager.LogError(LogCategory, PlainDriver.GetProtocol, LogMessage,
      ErrorCode, ErrorMessage);

    raise EZSQLException.CreateWithCode(ErrorCode, ErrorMessage);
     Format(SSQLError1, [ErrorMessage]));
  end;
end;
Atlant
новенький
Сообщения: 17
Зарегистрирован: 25.07.2006 08:43:29

Сообщение Atlant »

Подтверждаю, причем не только в данной версии
Ответить