Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как поймать свой RAISEERROR в Delphi

Delphi , Базы данных , Ошибки БД

Как поймать свой RAISEERROR в Delphi

Автор: Nomadic

Плох тот Error, который не мечтает стать General'ом.


procedure TFDMUtils.GeneralError(DataSet: TDataSet; E: EDatabaseError; var
  Action: TDataAction);
var
  i: Word;
  ExtInfo: string;
begin
  ExtInfo := '';

  if (E is EDBEngineError) then
  begin
    if (EDBEngineError(E).Errors[0].NativeError = 0) then
    begin // Local Error
      if EDBEngineError(E).Errors[0].Errorcode = 9732 then
        ExtInfo := DataSet.FieldByName(trim(copy(E.Message, 29,
          20))).DisplayLabel;
      .......................................
    end
    else
    begin // Remote SQL Server error
      ExtInfo := ExtractFieldLabels(DataSet, E.Message);
      case EDBEngineError(E).Errors[0].NativeError of
        233, 515:
          Alert('Ошибка', 'Hе все поля заполнены ! ' + ExtInfo);
        547:
          if (StrPos(PChar(E.Message), PChar('DELETE')) <> nil) then
            Alert('Ошибка пpи удалении',
              'Имеются подчиненные записи, удаление (изменение) невозможно! ' +
              ExtInfo)
          else if (StrPos(PChar(E.Message), PChar('INSERT')) <> nil) then
            Alert('Ошибка пpи вставке', 'Отсутствует запись в МАСТЕР-таблице! '
              + ExtInfo)
          else if (StrPos(PChar(E.Message), PChar('UPDATE')) <> nil) then
            Alert('Ошибка пpи обновлении',
              'Отсутствует запись в МАСТЕР-таблице! ' + ExtInfo);
        2601:
          Alert('Ошибка', 'Такая запись уже есть!');
      else
        Alert('Ошибка', 'Hеизвестная ошибка, код - ' +
          inttostr(EDBEngineError(E).Errors[0].NativeError) + ExtInfo);
      end;
    end;
  end;
end;

Этот код был заточен под MSSQL, но не нужно пытаться его использовать, а лучше по этому пpимеpу написать свою процедуру.

Бесподобный RAISEERROR! Чтобы поймать и обработать RAISEERROR в Delphi, вам нужно использовать блок Try... Except. Вот пример, как можно модифицировать ваш код:

procedure TFDMUtils.GeneralError(DataSet: TDataSet; E: EDatabaseError);
var
  i: Word;
  ExtInfo: string;
begin
  try
    // Ваш оригинальный код здесь
  except
    on E: EDBEngineError do
      begin
        if (E is EDBEngineError) then
          begin
            // Обработайте ошибку здесь
          end;
      end;
  end;
end;

В этом примере мы используем блок Try... Except, чтобы поймать любые исключения, которые могут возникнуть при выполнении вашего кода. Мы конкретно ловим исключение EDBEngineError, которое является типом исключения, возбужденным RAISEERROR. Внутри блока except вы можете обработать ошибку по мере необходимости. Вы можете получить оригинальное сообщение об ошибке и другие детали с помощью переменной E. Обратите внимание, что вам не нужно использовать отдельный процедуру для обработки ошибок; вы можете поместить код обработки ошибок непосредственно внутрь блока Try... Except. Также помните, что RAISEERROR обычно используется для возбуждения пользовательских ошибок в базе данных. Если вы используете Delphi с другой системой базы данных (например, Oracle), вам может потребоваться использовать другой подход для обработки ошибок.

В статье описывается методика ловли и обработки ошибок RAISEERROR в Delphi с использованием примера кода на языке Pascal.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Ошибки БД ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-08 18:21:12/0.0038042068481445/0