Проблема с обновлением данных в InterBase

alisultanov
Дата: 26.09.2005 20:13:58
Я недавно начал работать с базами данных.
Вообщем то из локальных перешел на удаленные БД.
Пользуюсь InterBase 6.5 .
Я не очень то секу в SQL, поэтому решил писать при помощи компонентов на вкладке InterBase.
Значить использую IBTransaction, IBDataSet, IBDataBase, DataSource, IBTable.
У меня возникла такая проблема. Я хочу чтобы данные которые я вношу в таблицу автоматически были видны на приложении другого пользователя.
Возможно ли это сделать при помощи IBTable. И если можно то пожалуйста напишите фрагмент кода который отвечает за это.
Больщое спасибо всем кто откликнется и поможет мне решить эту проблему.
kdv
Дата: 26.09.2005 20:38:07
http://www.ibase.ru/devinfo/ibx.htm
alisultanov
Дата: 26.09.2005 21:45:25
procedure TForm1.Button1Click(Sender: TObject);
begin
if IBTable1.CanModify
then
begin

IBDataSet1.Open;
IBDataSet1.Insert;
IBDataBase1.Connected:=true;
IBTransaction1.DefaultDatabase:=IBDataBase1;
IBTransaction1.Active:=true;
IBDataSet1.Database:=IBDataBase1;
IBDataset1.Transaction:=IBTransaction1;
IBDataSet1.Edit;

IBTable1.Active:=true;
IBTable1.Insert;
IBTable1.FieldByName('Soyadi').AsString:=edit1.Text;
IBTable1.FieldByName('Adi').AsString:=edit2.Text;
IBTable1.FieldByName('Secname').AsString:=edit3.Text;
IBTable1.FieldByName('tevellud').AsString:=combobox1.Text;
IBTable1.FieldByName('telefon').AsString:=edit5.Text;
IBTable1.FieldByName('doc_soyadi').AsString:=edit4.Text;
IBTable1.FieldByName('doc_adi').AsString:=edit6.Text;
IBTable1.FieldByName('doc_secname').AsString:=edit8.Text;
IBTable1.FieldByName('doc_workplace').AsString:=edit9.Text;
IBTable1.FieldByName('doc_telefon').AsString:=edit10.Text;
edit1.Text:='';
edit2.Text:='';
edit3.Text:='';
edit4.Text:='';
edit5.Text:='';
edit6.Text:='';
edit9.Text:='';
edit8.Text:='';
edit10.Text:='';
combobox1.ItemIndex:=0;
radiogroup1.Itemindex:=-1;

IBTransaction1.Commit;


IBTable1.Post;

IBTransaction1.CommitRetaining;
IBDataSet1.ApplyUpdates;
IBDataset1.Refresh;

IBTable1.ApplyUpdates;
IBTable1.Refresh;

end;


Если кто может подскажите что неправильно......
Выдает ошибку :Cann't modify a read-only dataset
VirusXP
Дата: 26.09.2005 22:28:50
alisultanov
Я хочу чтобы данные которые я вношу в таблицу автоматически были видны на приложении другого пользователя.
Возможно ли это сделать при помощи IBTable. И если можно то пожалуйста напишите фрагмент кода который отвечает за это.
Больщое спасибо всем кто откликнется и поможет мне решить эту проблему.

последовательность такая:
1. пишешь триггер на таблицу, который посылает сообщения приложениям-клиентам (не помню уж как называется процедура)
2. в Delphi вешаешь компонент EventAlerter (IBEventAlerter), прописываешь в нём обновление клиентского НД при изменении данных на сервере (посмотри его события)
вот собстно и всё!!!

З.Ы. В MS SQL такую возможность я уж полгода спрашиваю - никто не знает((

alisultanov

Если кто может подскажите что неправильно......
Выдает ошибку :Cann't modify a read-only dataset

значит датасет у тебя действительно в режиме read-only :-(:-)
arni
Дата: 27.09.2005 06:28:43
VirusXP
последовательность такая:
1. пишешь триггер на таблицу, который посылает сообщения приложениям-клиентам (не помню уж как называется процедура)
2. в Delphi вешаешь компонент EventAlerter (IBEventAlerter), прописываешь в нём обновление клиентского НД при изменении данных на сервере (посмотри его события)
Events являются очень специфическим инструментом и использовать их где попало не разумно по многим причинам. И уж во всяком случае фраза
"Я хочу чтобы данные которые я вношу в таблицу автоматически были видны на приложении другого пользователя"
никак не тянет на основательную предпосылку.

VirusXP
З.Ы. В MS SQL такую возможность я уж полгода спрашиваю - никто не знает((
Бедняги, вот не повезло-то им

To alisultanov: Почитайте про изолированность транзакций на www.ibase.ru, и про транзакции вообще

автор
IBDataSet1.Open;
IBDataSet1.Insert;
IBDataBase1.Connected:=true;
IBTransaction1.DefaultDatabase:=IBDataBase1;
IBTransaction1.Active:=true;
IBDataSet1.Database:=IBDataBase1;
IBDataset1.Transaction:=IBTransaction1;
IBDataSet1.Edit;
Первые две строки смотряться очень не уместно в контексте нижестоящих.
Должно быть так:
Коннект
Старт транзакции
Открытие датасета
Перевод его в режим вставки
автор
IBTransaction1.DefaultDatabase:=IBDataBase1;
IBDataSet1.Database:=IBDataBase1;
IBDataset1.Transaction:=IBTransaction1;
Подобные вещи вообще настраиваются в инспекторе объектов Delphi

автор
IBTransaction1.Commit;
IBTable1.Post;
IBTransaction1.CommitRetaining;
Это вообще секс.
Замечу мимоходом: Вы в курсе, что в момент вызова Commit все открытые датасеты закрываются?
иногда конечно можно видеть конструкцию:
Post;
CommitRetaining;
...
Commit;
Но сомневаюсь, что у Вас подобный случай.

автор
ApplyUpdates;
Это по теме "кешированные обновления". Вы в курсе что это такое? Оно Вам точно надо?

Контрольный вопрос: Вы сами это делали или помог кто? Если сами, то Вы хоть раз в справку дельфы заглядывали? на примеры тамошние смотрели?
Карабас Барабас
Дата: 27.09.2005 06:37:58
VirusXP
EventAlerter (IBEventAlerter), прописываешь в нём обновление клиентского НД
и радостные юзеры щедро благодарят ваятеля !

Posted via ActualForum NNTP Server 1.3