Чтение онлайн

на главную - закладки

Жанры

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

Эффект имеет место только с IB, вроде.

Нарушение уникальности записи

Delphi 1

try

 tMyTable.Post;

except

 on E : EDBEngineError do if E.Message = 'Key violation' then begin

MessageDlgC('Дублирование записи не допускается.' mtError, [mbOk], 0);

//
Я не уверен в том, что это нужно делать:

tMyTable.Cancel;

 end

 else Raise;

end;

Хорошим примером может служить проект DBERRORS.DPR, расположенный в каталоге Delphi 2 Demos. Выглядит это примерно так:

Создайте функцию типа этой:

function DBError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction);

const eKeyViol = 9729;

var iDBIError: Integer;

begin

 if (E is EDBEngineError) then begin

iDBIError := (E as EDBEngineError).Errors[0].Errorcode;

case iDBIError of

eKeyViol:

begin

MessageDlg('Нарушение уникальности записи ', mtWarning, [mbOK], 0);

Abort;

end;

end;

Затем для каждой таблицы вашего приложения создайте следующий обработчик события:

procedure TMainForm.Table1EditError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction);

begin

 DBError(Table1, E, Action);

end;

Таким образом вы можете перехватить множество ошибок. Смотрите примеры от Borland, там много чего есть полезного. 

При выполнении некоторых живых запросов, возвращающих единственную запись, BDE ругается 'multiple records found, but only one was expected'. Как лечить?

Nomadic отвечает:

Запросы вида SELECT c, b, a, q FROM T WHERE b = :b, где ключ c, но BDE посчитала ключом a. Интересный запрос, да? Такое впечатление, что, поскольку ключом в исходной таблице являлась третья колонка, то Дельфы посчитали ключом третью колонку.

Перестановкой SELECT a, b, c, q… все исправилось. Я решил теперь использовать в таких (live) запросах только SELECT *.

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

Nomadic отвечает:

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у написать свою процедуру.

Поделиться:
Популярные книги

Газлайтер. Том 8

Володин Григорий
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

На Ларэде

Кронос Александр
3. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
На Ларэде

Охота на попаданку. Бракованная жена

Герр Ольга
Любовные романы:
любовно-фантастические романы
5.60
рейтинг книги
Охота на попаданку. Бракованная жена

Кай из рода красных драконов

Бэд Кристиан
1. Красная кость
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кай из рода красных драконов

Хозяйка Проклятой Пустоши. Книга 2

Белецкая Наталья
2. Хозяйка Проклятой Пустоши
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка Проклятой Пустоши. Книга 2

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Потусторонний. Книга 2

Погуляй Юрий Александрович
2. Господин Артемьев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Потусторонний. Книга 2

Чапаев и пустота

Пелевин Виктор Олегович
Проза:
современная проза
8.39
рейтинг книги
Чапаев и пустота

Солнечный корт

Сакавич Нора
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Солнечный корт

Лютая

Шёпот Светлана Богдановна
Любовные романы:
любовно-фантастические романы
6.40
рейтинг книги
Лютая

Ведьмак (большой сборник)

Сапковский Анджей
Ведьмак
Фантастика:
фэнтези
9.29
рейтинг книги
Ведьмак (большой сборник)

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4

Ученик

Губарев Алексей
1. Тай Фун
Фантастика:
фэнтези
5.00
рейтинг книги
Ученик

Начальник милиции. Книга 5

Дамиров Рафаэль
5. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции. Книга 5