Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: СУБД и Delphi/Lazarus

  Все выпуски  

RusFAQ.ru: СУБД и Delphi


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / СУБД и Delphi

Выпуск № 252
от 08.12.2006, 18:35

Администратор:CJ
В рассылке:Подписчиков: 285, Экспертов: 32
В номере:Вопросов: 1, Ответов: 4


Вопрос № 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 и будет много меньше проблем (он бесплатный)
---------
Если дело заслуживает быть сделаным, то оно заслуживает чтобы его сделали ХОРОШО
Ответ отправил: Архангельский Андрей Германович (статус: Практикант)
Ответ отправлен: 02.12.2006, 19:15
Оценка за ответ: 4

Отвечает: 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"


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.37 от 04.10.2006
Яндекс Rambler's Top100

В избранное