Вопрос № 65275: Всем привет!
Пишу программку. Простенькую базу данных "Телефонная книга" на Delphi 5. База данных хранится в файле формата MS Access 2003. Использую компоненты ADO. В принципе все работает. Вот только проблема с проверкой имеющихся уже ...
Вопрос № 65.275
Всем привет!
Пишу программку. Простенькую базу данных "Телефонная книга" на Delphi 5. База данных хранится в файле формата MS Access 2003. Использую компоненты ADO. В принципе все работает. Вот только проблема с проверкой имеющихся уже данных при добавлении новых. Таблица, в которой хранятся данные, состоит из нескольких полей. Одно из них "Telephone" является ключевым. В БД не должно быть две записи с одним и тем же номером телефона. Все добавления и корректировка данных производится программно, т.е.
пользователю предлагается заполнить некие текстовые поля, затем нажать кнопку "Добавить" или "Отредактировать". При этом использую такие методы и процедуры компонента ADODataSet, как Edit, Append, Post. Проблема возникает при добавлении и редактировании данных, когда происходит, например, добавление уже имеющихся данных в БД. Допустим, заполняю все поля формы каким-либо способом. В поле же "Телефон" специально ввожу уже существующий в БД номе
р. Жму кнопку "Добавить", вылетает ошибка:
================
Project MyProgram.exe raised exception class EOleException with message 'Изменения не были успешно внесены из-за повторяющихся значений в индексе, ключевых полях или связях. Измените данные в поле или полях, содержащих повторяющиеся значения, удалите индекс или переопределите его, чтобы разрешить повторяющиеся значения, и повторите попытку'. Process stopped. Use Step or Run to continue.
================
В принципе ясно, что за ошибка. Поэтому решил перед добавление данных в таблицу или перед внесение изменений в Базу проверять на наличие в ней идентичных номеров телефонов. Попытался это сделать с помощью метода Lookup, но ничего что-то не выходит. В приложении приведу код процедуры TFrmEditKv.BtnOkClick. Помогите, пожалуйста, разобраться с этой проблемой.
Приложение:
Отправлен: 02.12.2006, 18:56
Вопрос задал: Бурда Саша (статус: Посетитель)
Всего ответов: 4 Мини-форум вопроса >>> (сообщений: 4)
Отвечает: Архангельский Андрей Германович
Здравствуйте, Бурда Саша!
Есть 2 варианта:
1) Перед вставкой сделать отдельный запрос и если ответ содержит строки (1), то во вставке отказать
2) Обработать генерируемое исключение самому. В Access это возможно, но сильно зависит от версии к версии.
Совет: переходи на Firebird и будет много меньше проблем (он бесплатный)
--------- Если дело заслуживает быть сделаным, то оно заслуживает чтобы его сделали ХОРОШО
Отвечает: sir henry
Здравствуйте, Бурда Саша!
Можно сделать маленько попроще. В Дельфи есть обработка исключительных ситуаций, которая и наблюдается у Вас, когда Вы пытаетесь занести существующие данные в поле с уникальным индексом. Добавьте в процедуру, где Вы заносите данные обработку исключения: Try
{Процедура добавляющая данные} Except
MessageBox(0, 'Ая-яй!!! Такой телефон уже есть в списке!', 'Караул!!!', MB_OK+MB_ICONSTOP+MB_APPLMODAL); End;
Таким образом, если Вы попытаетесь ввести существующий уже номер телефона или каким-то другим образом пытаетесь испортить данные в базе, то добавление происходить не будет, а выскочит окно-предупреждение.
Ответ отправил: sir henry (статус: Академик) Россия, Красноярск ---- Ответ отправлен: 02.12.2006, 19:18 Оценка за ответ: 4 Комментарий оценки: try ... except ... end не помогает
Отвечает: din
Здравствуйте, Бурда Саша!
Метод Lookup срабатывает не всегда, незнаю почему. Метод Locate работает без глюков, только при его вызове, если значение будет обнаружено, то текущей записью, на которой установлен курсор, окажется найденная. А вообще если Вы возложили "ответственность" за проверку на СУБД, то проще обработать само исключение:
try
вызов метода Post
except
Анализ кода ошибки и вывод соответствующего сообщения пользователю.
end;
Удачи!
--------- Есть только одно зло - невежество, и только одно благо - знания
Ответ отправил: din (статус: Практикант)
Ответ отправлен: 02.12.2006, 19:18 Оценка за ответ: 4 Комментарий оценки: Я сразу пробовал через try вызов метода Post except end. Но и в этом случае вылетала указанная выше ошибка
Отвечает: Химяк Виктор Васильевич
Здравствуйте, Бурда Саша!
Используйте конструкцию try... except...end;
То есть:
try
//здесть пишем все что мы хотим вставить,
//причем никакой проверки на наличие уже существующего номера
//делать не надо.
//Если ошибок нет, то Post пройдет нормально.
except
//если ошибка, выводим сообщение
ShowMessage('Такой номер телефона уже есть!');
exit;
end;
Для того что бы проверить, как будет работать, запускайте программу не из Дельфи.
Ответ отправил: Химяк Виктор Васильевич (статус: 2-ой класс)
Ответ отправлен: 03.12.2006, 22:26 Оценка за ответ: 4 Комментарий оценки: Попробовал и Ваш вариант. Откомпилировал программку. запустил exe-файл. Выдает сообщение "Invalid variant operation"