Russian Belarusian English German Japanese Ukrainian

Rashka.studio - игры и приложения для Android! Заходи, ждём тебя =)

Исключения баз данных

CuBook05

В дополнение к основным исключениям специально для операций, связанных с БД, система С++ Builder предоставляет следующие дополнительные классы исключений:
  • EDatabaseError - ошибка БД. Потомки этого класса:
    • EDBEngineError - ошибка BDE (для локальных и сетевых БД);
    • EDBciient - ошибка в приложении клиента (для сетевых БД архитектуры "клиент-сервер"); код ошибки Errorcode возвращается BDE, ADO, dbExpress или другим механизмом доступа к данным.
  • EUpdateError - ошибка, возникающая при обновлении записей.
  • EDBEditError - введенное в поле значение не соответствует типу поля.
Класс EDatabaseError предназначен для обработки ошибок, возникающих при выполнении операций с набором данных (объектом класса TDataSet и его потомков, в первую очередь, TTable и TQuery). Этот класс производится непосредственно от класса Exception. Исключение класса EDatabaseError генерируется, например, при попытке открыть набор данных, связанный с отсутствующей таблицей, или изменить запись набора данных, который находится в режиме просмотра.
 
Класс EDBEngineError предназначен для обработки ошибок, возникающих при работе с процессором баз данных BDE на локальном компьютере. В дополнение к свойствам, имеющимся у класса EDatabaseError, у класса EDBEngineError есть два новых свойства:
  • ErrorCount типа int - содержит количество возникших исключений;
  •  __property TDBError* Errors[int Index] = {read=GetError}; - представляет собой список исключений, общее число которых указано свойством ErrorCount. Индекс index позволяет получить доступ к возникшему исключению по его номеру (нумерация начинается с нуля). На практике обычно анализируется первое из исключений (Errors[0]), указывающее основную причину ошибки.
Объект класса TDBError содержит информацию об исключении, определяемую следующими свойствами:
  • Message типа Ansistring (текст сообщения, характеризующего возникшую ошибку);
  • ErrorCode типа Word (код ошибки);
  • Category типа Byte (категория исключения);
  • Subcode типа Byte (группа, или подкод, исключения);
  • NativeError типа int (код ошибки, возвращаемой сервером) - если значение этого свойства равно нулю, то исключение произошло не на сервере.
Код ошибки, определяемый значением свойства ErrorCode, имеет две составляющие: категорию и группу исключения, определяемые значениями свойств Category и Subcode соответственно. В категорию объединяются по признаку схожести несколько исключений. Группа уточняет исключение внутри категории.
 
Отметим, что для программной генерации исключений, обслуживаемых классами EDatabaseError и EDBEngineError, используются специальные методы DatabaseError и DBIError.
 
Класс EDBClient отличается от класса EDBEngineError в основном тем, что предназначен для обработки ошибок, возникающих при работе с различными механизмами доступа к данным (не только с процессором баз данных BDE) в операциях с сетевыми базами архитектуры «клиент-сервер».
 
Генерируемые при работе с БД исключения обрабатывают глобальные и локальные обработчики, с которыми мы познакомимся позже. Кроме того, используемые для доступа к данным компоненты имеют специальные события для обработки исключений.
 
Например, для набора данных Table такими событиями являются:
  • onEditError (ошибка редактирования или вставки записи);
  • onPostError и OnUpdateError (ошибка закрепления изменений в записи);
  • onDeleteError (ошибка удаления записи).
Использование соответствующих событий и программирование их обработчиков будут рассмотрены при изучении соответствующих компонентов.
 
Класс EDBEditError используется в случаях, когда вводимые в поле данные несовместимы с маской ввода, заданной с помощью свойства EditMask этого поля. Отметим, что для проверки вводимых в поле значений можно также использовать события OnSetText, OnValidate и OnChange.
 
Для примера приведем процедуру, в которой проводится анализ исключения, возникшего при работе с базой данных с помощью BDE.
void __fastcall TForm1::ButtonlClick(TObject *Sender)
{
try
{
if (OpenDialog1->Execute()) {
Table1->Active = false;
Table1->TableName = OpenDialogl->FileName;
Table1->Active = true; }
}
catch (EDatabaseError&Err){
MessageDlg("Ошибка EDatabaseError!", mtError, TMsgDlgButtons() << mbOK, 0); }
catch (EDBEngineError&Err){
MessageDlg("Ошибка EDBEngineError!", mtError, TMsgDlgButtons() << mbOK, 0); }
catch (...) {
MessageDlg("Неопознанная ошибка!", mtError, TMsgDlgButtons() << mbOK, 0);} }
 
При смене таблицы, связанной с набором данных Table1, выполняются анализ и обработка возможного исключения. Исключение проверяется на принадлежность к одному из двух классов: EDatabaseError и EDBEngineError. Обработка заключается в выдаче сообщения о принадлежности исключения к одному из этих классов. Если исключение носит другой характер, то выдается сообщение о том, что оно не распознано.
Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

Добавить комментарий