Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];

Вниз

обработка ошибок в базе данных   Найти похожие ветки 

 
intel ©   (2005-10-08 06:54) [0]

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


 
Anatoly Podgoretsky ©   (2005-10-08 13:05) [1]

Это невозможно, в таблице может быть только один первичный ключ


 
intel ©   (2005-10-08 17:02) [2]

нет мне надо чтобы программа не добавляла эти данные в базу, а бывела сообщение(не завершая работу программы)


 
Германн ©   (2005-10-09 02:40) [3]

А как ты их добавляешь?
В процедуре добавления проверяй ошибки и реагируй соответственно. Сообщай юзеру об ошибке и отменяй запись в базу.


 
intel ©   (2005-10-09 08:23) [4]

я добавляю в базу с помощю процедуры Table1.InsertRecord
я не знаю как проверять охибки


 
Anatoly Podgoretsky ©   (2005-10-09 13:34) [5]

Сделай сначала первичный ключ (ОДИН)


 
intel ©   (2005-10-09 19:17) [6]

я сделал один первичный ключ, как теперь мне проверять его правильность?


 
Fay ©   (2005-10-09 19:20) [7]

2 Anatoly Podgoretsky ©   (09.10.05 13:34) [5]
Мне почему-то кажется, что речь идёт о естественном ключе из двух полей...

P.S.
...об ОДНОМ 8)


 
Anatoly Podgoretsky ©   (2005-10-09 19:20) [8]

В блоке try except


 
Anatoly Podgoretsky ©   (2005-10-09 19:21) [9]

Fay ©   (09.10.05 19:20) [7]
А я по твоему про что?


 
Fay ©   (2005-10-09 20:09) [10]

2 Anatoly Podgoretsky ©   (09.10.05 19:21) [9]
Дык, по всему выходит, что автор уже позаботился о создании такого крюча, презрев тот очевидный факт, что "Это невозможно"


 
intel ©   (2005-10-09 20:38) [11]

я в базе через DataBase Desktop поставил 2 звездочки около нужных строк в поле "key"


 
Германн ©   (2005-10-10 02:47) [12]

Ты всё сделал правильно.
Только не сказал, какой движок баз данных ты используешь :(
Имхо, это - Парадокс.
Тогда смотри [8]


 
intel ©   (2005-10-10 06:23) [13]

я написал вот так, но что у меня не правильно?
try
FORM2.Table1.InsertRecord([Edit8.text,
                          Edit9.text,
                          a,//Edit7.text,
                          form2.ComboBox1.text,
                          form2.ComboBox2.text,// Edit11.text,
                          Edit2.text,
                          form2.ComboBox3.text,
                          Edit3.text,
                          Edit4.text,
                          form2.ComboBox4.text,//Edit13.text,
                          Edit5.text,
                          form2.Memo1.Lines,
                          form2.ComboBox3.text,
                          b]);

except EDatabaseError do
 showmessage("bla bla bla")


 
syte_ser78 ©   (2005-10-10 17:05) [14]

Только не нужно говорить что в этом виноват Архангельский


 
msguns ©   (2005-10-10 17:41) [15]

>syte_ser78 ©   (10.10.05 17:05) [14]
>Только не нужно говорить что в этом виноват Архангельский

Я думаю, что, возможно, Фаронов. Именно у него во всех примерах нет ни одной проверки на корректность данных в эдитах !
Кроме того, нет даже упоминания о предваряющем поиске в таблице записей с добавляемыми ключами (индексами). Видимо, подразумевается, что Ttable (компонент, которому посвящено больше всего места в книге по работе с БД в Дельфи) сам все сделает как надо ;))


 
intel ©   (2005-10-10 18:08) [16]

а причем тут Фаронов и Архангельский?
Объясните мне пожалуйста как мне проверить наличие ошибки.


 
icWasya ©   (2005-10-10 18:21) [17]

ну если по синтаксису то
try
FORM2.Table1.InsertRecord([Edit8.text,
                         Edit9.text,
                         a,//Edit7.text,
                         form2.ComboBox1.text,
                         form2.ComboBox2.text,// Edit11.text,
                         Edit2.text,
                         form2.ComboBox3.text,
                         Edit3.text,
                         Edit4.text,
                         form2.ComboBox4.text,//Edit13.text,
                         Edit5.text,
                         form2.Memo1.Lines,
                         form2.ComboBox3.text,
                         b]);

except on E:EDatabaseError do
showmessage("bla bla bla")
end;


 
Anatoly Podgoretsky ©   (2005-10-10 19:29) [18]

Не знаю кто, но использовать InsertRecord как то не кошерно. А обрабатывать все равно в try except


 
intel ©   (2005-10-11 06:23) [19]


> Не знаю кто, но использовать InsertRecord как то не кошерно.

я просто при добавлении записей в БД не хотел мучиться с BDEditами


 
intel ©   (2005-10-12 06:17) [20]

Удалено модератором
Примечание: Создание пустых сообщений


 
intel ©   (2005-10-23 17:08) [21]

Удалено модератором
Примечание: Создание пустых сообщений


 
msguns ©   (2005-10-23 18:17) [22]

У TDataSet (деда TTable) есть события, одно из которых называется BeforeInsert. В обработчике его надо послать запрос, ищущий в таблице записи с введенными юзером ключами:

Что-то типа

result := true;
With TQuery.Create(nil) do
  try
    DataBase := Table1.DataBase;
    SQL.Text := "SELECT * FROM "+Table1.TableName+" WHERE ("+Table1.Fields[0].FieldName+"=:par1) AND ("+Table1.Fields[1].FieldName+"=:par2)";
    ParamByName("par1").AsString=Edit1.Text; // Ключ- поле1
    ParamByName("par1").AsString=Edit2.Text; // Ключ- поле2
    Open;
    if RecordCount=0 then result := false;
    Close;
  finally
    Free;
  end;
 
Хотя у тебя есть уже 2 глобальные ошибки:
1. Использование в качестве праймари нативных объектов
2. Использование TTable


 
msguns ©   (2005-10-23 18:21) [23]

Блин, поправка:

Вместо result использовать переменную типа бул
В конце после with..end добавить:

if <bool-переменная> then
  begin
   ShowMessage("Уже есть в БД");
   abort;
  end;

Кстати, такой обработчик не убережет тебя от граблей в многопользовательскои режиме.


 
Anatoly Podgoretsky ©   (2005-10-23 19:59) [24]

msguns ©   (23.10.05 18:17) [22]
Это хорошо для однопользовалького варианта и неверно для многооднопользовалького.


 
msguns ©   (2005-10-23 20:08) [25]

>Anatoly Podgoretsky ©   (23.10.05 19:59) [24]
>Это хорошо для однопользовалького варианта и неверно для многооднопользовалького

А перечитать концовку [23] ?



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.041 c
2-1129620796
T10000
2005-10-18 11:33
2005.11.13
Работа с датой ?


14-1129748306
Bogdan1024
2005-10-19 22:58
2005.11.13
как программирование на вас влияет?


3-1128508944
dragon_dp
2005-10-05 14:42
2005.11.13
Как узнать существует ли таблица в БД?


2-1129803546
Arimag
2005-10-20 14:19
2005.11.13
Как проиграть свой собственный звук?


1-1129806966
kivadim
2005-10-20 15:16
2005.11.13
как получить доступ из одного объекта к элементам др. объекта





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский