Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

обработка ошибок в базе данных [D6, XP]


Страницы:   1 2

intel ©   (2005-10-08 06:54:00) 

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


msguns   (2005-10-23 20:08:00) [1]

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

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


Anatoly Podgoretsky   (2005-10-23 19:59:00) [2]

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


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

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

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

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

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


msguns   (2005-10-23 18:17:00) [4]

У 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


intel   (2005-10-23 17:08:00) [5]

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


intel   (2005-10-12 06:17:00) [6]

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


intel   (2005-10-11 06:23:00) [7]


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

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


Anatoly Podgoretsky   (2005-10-10 19:29:00) [8]

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


icWasya   (2005-10-10 18:21:00) [9]

ну если по синтаксису то
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;


intel   (2005-10-10 18:08:00) [10]

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


msguns   (2005-10-10 17:41:00) [11]

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

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


syte_ser78   (2005-10-10 17:05:00) [12]

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


intel   (2005-10-10 06:23:00) [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')


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

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


intel   (2005-10-09 20:38:00) [15]

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


Fay   (2005-10-09 20:09:00) [16]

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


Anatoly Podgoretsky   (2005-10-09 19:21:00) [17]

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


Anatoly Podgoretsky   (2005-10-09 19:20:00) [18]

В блоке try except


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

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

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


intel   (2005-10-09 19:17:00) [20]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо