Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.13;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.033 c
14-1129974768
pazitron_brain
2005-10-22 13:52
2005.11.13
Снова про окна.


9-1118589678
OSokin
2005-06-12 19:21
2005.11.13
Посмотрите, плиз...


14-1129577841
Nic
2005-10-17 23:37
2005.11.13
Сдача сессии.


14-1129898967
oldman
2005-10-21 16:49
2005.11.13
пятничная задачка...


1-1129828333
Dwen
2005-10-20 21:12
2005.11.13
создание и распечатка таблицы из memo