Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Обновление информации в DBGrid


Автор: Darked 28.11.2007, 16:47
             Доброе время суток.
  Господа программеры, подскажите пожалуйста в чём упущение. Есть TIBDataBase, TIBQuey, TIBTransaction, TDataSource, TDBGrid, где   и планируется отображать результаты работы TIBQuery. База FireBird 2.0. Так вот, пишу такое событие по нажатию кнопки:
Код

procedure TMainF.BitBtn1Click(Sender: TObject);
begin

  qibQuery.Active := False;
  qibQuery.Close;
  qibQuery.SQL.Clear;

  qibQuery.SQL.Add('INSERT INTO persons (pers_id, name, family, PERS_CONT_ID, PERS_TECH_ID) '+
                       'VALUES (1,''name'', ''Family'', 1, 1)');

  qibQuery.ExecSQL;

  qibQuery.Active := True;
end;


   И в момент "qibQuery.Active := True;" программа падает с ошибкой: 
Цитата

Exception class EIBInterBaseError with message 'violation of PRIMARY or UNIQUE KEY constraint "INTEG_10" on table "PERSONS"

   
   Таблица, куда производится запись пустая. В чём ошибка?

Автор: DimW 28.11.2007, 17:51
а так: 
Код

procedure TMainF.BitBtn1Click(Sender: TObject);
begin

  qibQuery.Close;
  qibQuery.SQL.Clear;

  qibQuery.SQL.Add('INSERT INTO persons (pers_id, name, family, PERS_CONT_ID, PERS_TECH_ID) '+
                       'VALUES (1,''name'', ''Family'', 1, 1)');

  qibQuery.ExecSQL;

end;


при выполнении qibQuery.Active := True; ты вставляешь позицию повторно, зачем? достаточно qibQuery.ExecSQL;

Цитата(Darked @  28.11.2007,  16:47 Найти цитируемый пост)
где   и планируется отображать результаты работы TIBQuery

о каком отображении идет речь? для начала хотя бы select * from persons нужно в qibQuery.SQL заталкать.

Автор: Darked 28.11.2007, 21:07
DimW,  дело в том, что как только проходит qibQuery.ExecSQL, то в DBGrid сразу информация исчезает, DBGrid переходит к своему первоначальному виду, пропадают все столбцы и строки, как будто я его только поместил на форму и ни к чему не подсоединял.
  Вот и не начал с TIBQuery эксперементировать.

Цитата(DimW @  28.11.2007,  17:51 Найти цитируемый пост)
о каком отображении идет речь? для начала хотя бы select * from persons нужно в qibQuery.SQL заталкать.

   Ну, в будущем ))

Автор: pavelv 29.11.2007, 05:47
Ругается на первичный ключ, или дублирование записи или может значение какое-то null пытаешься запихнуть где ему таковым быть нельзя(хотя вроде другая ошибка должна быть). А так подытожив слова DimW:
Код

procedure TMainF.BitBtn1Click(Sender: TObject);
begin

  qibQuery.Close;
  qibQuery.SQL.Clear;

  qibQuery.SQL.Add('INSERT INTO persons (pers_id, name, family, PERS_CONT_ID, PERS_TECH_ID) '+
                       'VALUES (1,''name'', ''Family'', 1, 1)');

  qibQuery.ExecSQL;

  qibQuery.Close;
  qibQuery.SQL.Clear;

  qibQuery.SQL.Add('select * from persons');

  qibQuery.ExecSQL;

end


Вообще совет, если ты работаешь с одной таблицей и намерен постоянно добавлять, удалять и редактировать записи в ней используй компонент TibTable, я так понял у тебя InterBase. Компонент простой и удобный, и всякой фигни с дополнительными запросами чудить не нужно. 

Автор: Darked 29.11.2007, 07:45
   Да, зачем мне лишний компонент тянуть (это я про TIBTable), хочу разобраться именно с TIBQuery. Должно же как - то это работать. Собственно вопрос как обновить данные в TDBGrid. Потому что, так то всё работает, записи в базу добавляются, но проблема в отображении на экране изменений.

Автор: DimW 29.11.2007, 08:40
pavelv, в последней строке кода не qibQuery.ExecSQL;, а qibQuery.Active := True;

Darked, ты понимаешь разницу между добавлением данных в БД и их считыванием?!
Цитата(Darked @  28.11.2007,  21:07 Найти цитируемый пост)
Ну, в будущем ))

ну так вот когда все таки решишься на этот шаг тогда и получишь данные в гриде.
pavelv, теде написал код который делает то что ты хочешь, с учетом моих замечаний.


Цитата(Darked @  29.11.2007,  07:45 Найти цитируемый пост)
Да, зачем мне лишний компонент тянуть 

это спорный вопрос, скорее он не лишний, а вспомогательный.

Автор: Darked 29.11.2007, 10:07
Цитата(DimW @  29.11.2007,  08:40 Найти цитируемый пост)
Darked, ты понимаешь разницу между добавлением данных в БД и их считыванием?!

   Согласен, некорректно выражал мысли. Разницу понимаю )) Если делать выборку, то всё работает и обновляется не вопрос, меня интересует вопрос - когда я вставляю в таблицу данные, как мне отобразить эти изменения в таблице? То есть добавил записьи чтобы эти изменения отобразились в DBGrid, поэтому и начал эксперементировать со свойством Active. Догадываюсь что возможно я как - то неправильно транзакцию делаю.... или не делаю её вообще ;(
   
  Завершение транзакции я делаю лишь только так TIBTransaction.CommitRetaining; Может тут что не так?

Автор: Deniz 29.11.2007, 11:55
Цитата(pavelv @  29.11.2007,  08:47 Найти цитируемый пост)
используй компонент TibTable
 НИКОГДА НИКОМУ не использовать.
Использовать только TIBDataSet

Цитата(DimW @  29.11.2007,  11:40 Найти цитируемый пост)
не qibQuery.ExecSQL;, а qibQuery.Active := True;
если мне не изменяет память, то когда в запросе написано select ... from ..., то IBX по барабану что вызывать Open, ExecSQL или Active:=True результат один.

Автор: pavelv 29.11.2007, 12:36
Darked я так понимаю мы тебе что-то другое говорим, поясни фразу:-"меня интересует вопрос - когда я вставляю в таблицу данные, как мне отобразить эти изменения в таблице?". Ты новый данные хочешь как-то выделить на фоне остальных чтоли?

P.S> Deniz что ты так на TibTable наезжаешь? Если не трудно поясни, а то уж сколько его использую и никогда проблем не замечал.

Автор: Darked 29.11.2007, 12:52
Цитата(pavelv @  29.11.2007,  12:36 Найти цитируемый пост)
P.S> Deniz что ты так на TibTable наезжаешь? Если не трудно поясни, а то уж сколько его использую и никогда проблем не замечал. 

    Есть такое мнение что настоящие программисты не используют T*Table, всё вручную через SQL, то есть применение их есть дурной тон.


Цитата(pavelv @  29.11.2007,  12:36 Найти цитируемый пост)
Ты новый данные хочешь как-то выделить на фоне остальных чтоли?

     Да нет, в таблице есть данные, эта таблица отображается в DBGrid. Я добавляю строку и хочу чтобы DBGrid сделал REFRESH, то есть обновил отображаемые данные и показал таблицу с учётом добавленной записи.

Автор: Darked 29.11.2007, 14:39
    Всем большое спасибо!!!!! Код, который pavelv работает, я не обратил внимание на добавку qibQuery.SQL.Add('select * from persons');
    Теперь всё работает.

Автор: Deniz 29.11.2007, 16:42
Цитата(pavelv @  29.11.2007,  15:36 Найти цитируемый пост)
Deniz что ты так на TibTable наезжаешь? Если не трудно поясни, а то уж сколько его использую и никогда проблем не замечал. 

Цитата(Darked @  29.11.2007,  15:52 Найти цитируемый пост)
  Есть такое мнение что настоящие программисты не используют T*Table, всё вручную через SQL, то есть применение их есть дурной тон.


Читайте http://www.ibase.ru
Например http://www.yandex.ru/yandsearch?text=IBTable&SUBMIT=%CD%E0%E9%F2%E8%21&serverurl=www.ibase.ru&server_name=www.ibase.ru&referrer1=http%3A%2F%2Fwww.ibase.ru&referrer2=www.ibase.ru
Если имя Димы Кузьменко Вам о чем-то говорит, стоит прислушаться.

Автор: Darked 30.11.2007, 12:35
    Тема закрыта )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)