Главная » C++, C++ Builder » Проверка данных БД в CBuilder

0

Если бы мы жили в идеальном мире, мы бы просто позволили пользователям изменять данные, как им заблагорассудится, и предоставить CBuilder выполнять всю остальную работу. Если вы знаете, где находится идеальный мир, расскажите и мне — я тоже хочу там побывать. В этом же мире, к сожалению, вопрос проверки целостности данных (data integrity) в базе неизбежно поднимается при любом обсуждении приложений, работающих с базами данных.

Целостность данных означает, что данные в вашей базе корректны и представлены в корректном формате. В нашем примере, например, нельзя позволить пользователю вводить буквы или знаки препинания в поле ZIP-кода (почтового индекса). Несмотря на то что поле ZIP-кода хранится в виде строки символов, в действительности оно представляет собой число. По этой причине мы должны иметь возможность проверить значение, вводимое в поле ZIP-кода на  допустимость. Другие поля в ваших базах данных могут требовать и других, специальных проверок.

До сих пор в наших обсуждениях событий в базах данных мы останавливались лишь на тех изменениях, которые происходят, когда пользователь что-то делает с  базой  данных.  Однако  с точки зрения проверки данных поздно что-либо с ними делать, когда запись уже внесена в базу данных. Эта информация нужна нам до того, как запись окажется на диске. Для этого служат события Beforexxx (где на месте xxx — Insert, Delete или Post).

Событие Post возникает, когда происходит изменение записи базы данных. Подсистема работы с базами данных CBuilder сгенерирует событие BeforePost до того, как запись будет внесена в базу данных. Здесь вам и предоставляется шанс проверить введенные данные перед тем, как разрешить дальнейшее прохождение процесса. Если проблем не возникло, вы просто разрешаете продолжение процесса с его обработкой по умолчанию (которая состоит в физическом занесении записи обратно в файл базы данных). С другой стороны, если проблемы с обработкой данных в

записи все же возникли, вам надо остановить процесс, не дав ему осуществиться до конца, а для этого надо воспользоваться методом Abort (прервать). Вот код, который надо ввести в обработчик события BeforePost:

void __fastcall TForm2::Table1BeforePost(TDataSet *DataSet)

{

// Сначала проверим, введено ли значение ZIP-кода if  (Table1ZIPCODE->Text.IsEmpty())

{

MessageBox(NULL,"Необходимо ввести ZIP-код!", "Ошибка",MB_OK);

Abort(); return;

}

// Удостоверяемся, что для ZIP-кода введено

// числовое значение

std::string s = Table1ZIPCODE->Text.c_str(); for (int i=0; i<s.size(); ++i)

{

if (!isdigit(s[i]))

{

MessageBox(NULL,

"ZIP-код должен иметь числовое значение!", "Ошибка",MB_OK);

Abort();

return;

}

}

// Все в порядке, разрешаем дальнейшее прохождение

// процесса занесения записи в базу данных

}

В качестве примечания скажу, что для того, чтобы скомпилировать приведенный выше код, вам надо включить <string.h> в начало вашего исходного файла, чтобы получить определение класса string STL.

Для каждого события обработчик BeforePost проверяет каждый  символ  ZIP-кода  и удостоверяется, что это цифра. Если же нет, или если поле ZIP-кода пусто, пользователю сообщается о совершенной им ошибке и вызывается метод Abort.

Теперь скомпилируйте и запустите приложение. Если вы не сделали слишком много ошибок при наборе текста примера, вы должны увидеть нашу форму редактирования базы данных. Введите строку ABCDEF в поле ввода ZIP-кода и щелкните на кнопке записи, чтобы отобразить изменение в базе данных. Вы увидите окно сообщения с предупреждением о том, что поле ZIP-кода должно быть числовым. После этого CBuilder откроет окно диалога, сообщающее, что произошло нечто ужасное. В чем же здесь дело?

Ответ состоит в том, что CBuilder автоматически генерирует  исключительную  ситуацию (exception), когда вы вызываете метод Abort. Это не значит, что исключительная ситуация не обрабатывается, в чем вы можете убедиться, сообщив, что желаете  продолжить  работу программы. Все дело в том, что вы велели программе останавливаться в случае возникновения исключительных ситуаций. Вы не помните, чтобы делали такое? Ну, по правде говоря, вы этого и не делали. CBuilder

устанавливает этот флаг по умолчанию. Если вас это не  устраивает,  как  не  устраивает большинство программистов, вы можете его изменить. Выберите команду меню Options|Environment и взгляните на область Debugging на первой странице свойств. Снимите флажок Break on exception (останов при исключительной ситуации) и снова запустите программу. Она больше не будет выдавать пугающих сообщений об исключительных ситуациях, а будет работать так, как вы от нее ожидали.

Проверка любых других полей на соответствие данных может быть осуществлена тем же путем. Проверка при удалении (проверка соответствующих записей и тому подобное) может производиться в совершенно аналогичном обработчике события BeforeDelete.

На этом пример на обработку событий закончен, и я надеюсь, что вы теперь знаете чуть больше о том, как система обработки сообщений и система поддержки баз данных сосуществуют в среде CBuilder.

Источник: Теллес М. – Borland C++ Builder. Библиотека программиста – 1998

По теме:

  • Комментарии