Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.51 MB
Время: -0.971 c
2-1130136258
F1
2005-10-24 10:44
2005.11.13
Блокировка кнопки закрытия модального окна.


2-1129617492
TruthMan
2005-10-18 10:38
2005.11.13
Запись в таблицу через сервер Word


2-1129874261
Xmen
2005-10-21 09:57
2005.11.13
проблема со знаком " "


3-1128073045
Ega23
2005-09-30 13:37
2005.11.13
Raiserror в вызове ХП


2-1130240207
VEZ
2005-10-25 15:36
2005.11.13
Hex SpinEdit




   Наверх