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

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

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

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

Сообщение voltron » 06.07.2007 13:50:24

Только начинаю осваивать взаимодействие в 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 » 10.07.2007 10:27:51

Проблема решилась. Правда частично.
Для перехвата и обработки ошибок нужно использовать конструкцию
Код: Выделить всё
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;
voltron
новенький
 
Сообщения: 64
Зарегистрирован: 06.07.2007 13:27:46
Откуда: Украина

Сообщение Atlant » 20.07.2007 10:36:20

Подтверждаю, причем не только в данной версии
Atlant
новенький
 
Сообщения: 17
Зарегистрирован: 25.07.2006 08:43:29


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 88

Рейтинг@Mail.ru