Topic: Обработка ошибок связанных с базой данных

Данный пример позволяет обработать ошибку, которая возникла непосредственно в базе данных (СУБД).


Например вы установили ограничение UNIQUE для какого либо поля в БД. Когда вы пытаетесь создать запись с дубликатом по данному полю, то получите системную ошибку от СУБД, которую можете перехватить и обработать ее так, как вам необходимо. Пример:

// глобальное события для всех ошибок от СУБД
function OnSQLException(Sender: TObject; Msg: string; SQL: string): boolean;
begin
    // ошибка при выполнении функций SQLExecute или SQLQuery
    if Sender=nil  then
    begin
        result := true; // предотвращает показ системной ошибки
        ShowMessage(Msg); // ваше сообщение об ошибке может быть здесь
    end;

    // ошибка возкнила при выполнении действия кнопки frmEmployee.bSaveEmp
    if Sender = frmEmployee.bSaveEmp then 
    begin
        if Pos('UNIQUE constraint failed', Msg)=1 then // по тексту сообщения узнает тип ошибки.
        begin
            result := True; // предотвращает показ системной ошибки
            MessageBox('Человек с данной фамилией уже присутствует в БД..', 'Error', MB_OK+MB_ICONWARNING);
        end;
    end;
end;



procedure Form1_Button5_OnClick (Sender: string; var Cancel: boolean);
begin
    SQLExecute('INSERT INTO employees (lastname) VALUES ("ivanov")');
end;


procedure Form1_Button6_OnClick (Sender: string; var Cancel: boolean);
var
    Results: TDataSet;
begin
    SQLQuery('INSERT INTO employees (lastname) VALUES ("ivanov")', Results);
end;

Проект с примером:

Post's attachments

Attachment icon OnSQLException.zip 7.33 kb, 126 downloads since 2017-03-20 

Dmitry.

Re: Обработка ошибок связанных с базой данных

Дмитрий, здравствуйте!
Возможно реализовать перехват ошибки связанной с потерей соединения с базой данных MySQL?
Пробовал вариант указанный вами выше, не срабатывает. Видимо работает только с ответом от БД.
Ошибка при потере соединения начинается так : Cannot connect to server

Re: Обработка ошибок связанных с базой данных

Здравствуйте.


Прощу прощения за задержку с ответом, был в отпуске. Вопрос все еще актуален для Вас?

Dmitry.

Re: Обработка ошибок связанных с базой данных

DriveSoft wrote:

Здравствуйте.


Прощу прощения за задержку с ответом, был в отпуске. Вопрос все еще актуален для Вас?

Да Дмитрий, вопрос актуален.
Обратил внимание что скрипт с обработкой ошибки срабатывает если ошибка вызывается в следствии нажатия на кнопку с предустановленным действием (т.е. с действием кнопки выбранным из визуального интерфейса программы). Если же нажатие на кнопку запускает скрипт запроса в базу SQL, то обработка ошибки просто игнорируется.

Re: Обработка ошибок связанных с базой данных

Данное событие предназначено для перехвата ошибок связанных с исполнением SQL запросом. События для ошибок связанных с подключением к серверу пока не предусмотрено.

Dmitry.

Re: Обработка ошибок связанных с базой данных

DriveSoft wrote:

Данное событие предназначено для перехвата ошибок связанных с исполнением SQL запросом. События для ошибок связанных с подключением к серверу пока не предусмотрено.

Ясно, жаль

Re: Обработка ошибок связанных с базой данных

DriveSoft wrote:

...Например вы установили ограничение UNIQUE для какого либо поля в БД...

Не нашёл такой возможности в конструкторе (v. 3.6).  Как добавить уникальность к полю БД?  Возможность проверки перед сохранением с помощью скриптов видел в ветке  http://myvisualdatabase.com/forum/viewtopic.php?id=1062

Re: Обработка ошибок связанных с базой данных

k245
В конструкторе пока такой возможности нет, но вы можете сделать этого с помощью программы SQLite Studio, открыв в этой программе файл базы данных sqlite.db

Dmitry.