Странное поведение компонентов IBX ?

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
Tizoc
Сообщения: 14
Зарегистрирован: 16 июн 2005, 20:24

Странное поведение компонентов IBX ?

Сообщение Tizoc » 24 ноя 2006, 13:09

Сервер IB7.5.1.162. IBX 7.09. Delphi 7(Build 8.1).

Есть приложение. TIBDatabasе, транзакции, датасеты, все это расположено на главной форме. Есть вторая форма, форма с DBGrid`ом, она использует TIBDatabase главной формы, но имеет свои TIBTransaction, TIBDataset, TIBScript и тд. Вторая форма модальная. При ее открытие открывается база, транзакция, датасет, данные показываются в гриде, при закрытии соответственно все закрывается. При удалении записи, используя IBScript модальной формы, после закрытия и открытия транзакции, после переоткрытия датасета, в Гриде информация не обновляется!. Приехали ?! В чем может быть проблема ?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 24 ноя 2006, 13:12

www.ibase.ru/devinfo/ibx.htm#ibtransaction
плюс www.ibase.ru/devinfo/ibtrans.htm про уровни изолированности.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Странное поведение компонентов IBX ?

Сообщение WildSery » 24 ноя 2006, 13:21

Tizoc писал(а):При удалении записи, используя IBScript модальной формы
Какова необходимость удалять запись используя именно IBScript?

Tizoc
Сообщения: 14
Зарегистрирован: 16 июн 2005, 20:24

Сообщение Tizoc » 24 ноя 2006, 13:22

kdv писал(а):www.ibase.ru/devinfo/ibx.htm#ibtransaction
плюс www.ibase.ru/devinfo/ibtrans.htm про уровни изолированности.
Спасибо, конечно, но все это я уже читал. И игра настройками транзакции (что Snapshot, что Read Comitted) тут не помогает. И та что Snapshot (concurrency no_wait) должна работать судя по описаниям, так как изменения в базу внесены, Commit сделан, транзакция, с которой связан датасет и Грид, стартуется заново, соответственно должна видеть все изменения и получить обновленный TIP.

Tizoc
Сообщения: 14
Зарегистрирован: 16 июн 2005, 20:24

Re: Странное поведение компонентов IBX ?

Сообщение Tizoc » 24 ноя 2006, 13:27

WildSery писал(а):
Tizoc писал(а):При удалении записи, используя IBScript модальной формы
Какова необходимость удалять запись используя именно IBScript?
Потому что удобнее. Запрос на показ записей в Гриде идет в c union`ами
ко многим таблицам, соответвтенно и удалять в датасете все это просто так нельзя. А в IBSctipt все просто и удобно, узнал что за запись... и go.
"Delete from xxx where something=xx" , ExecuteScript, Commit. Но к сути проблемы какое это отношение имеет ?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 24 ноя 2006, 13:30

И игра настройками транзакции (что Snapshot, что Read Comitted) тут не помогает.
не верю. если запись вставлена в одной транзакции, и сделан commit, то эта запись будет видна в другой транзакции, если она read committed, и если запрос ВЫПОЛНЕН ПОВТОРНО. Сервер сам вам в грид ничего пихать не будет.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 24 ноя 2006, 13:31

"Delete from xxx where something=xx" , ExecuteScript, Commit. Но к сути проблемы какое это отношение имеет ?
извините, но бредово это как то. не проще использовать IBQuery или вообще IBSQL? IBScript все-таки для выполнения скриптов предназначен, а не для выполнения одиночных запросов.

Tizoc
Сообщения: 14
Зарегистрирован: 16 июн 2005, 20:24

Сообщение Tizoc » 24 ноя 2006, 14:14

kdv писал(а):
И игра настройками транзакции (что Snapshot, что Read Comitted) тут не помогает.
не верю. если запись вставлена в одной транзакции, и сделан commit, то эта запись будет видна в другой транзакции, если она read committed, и если запрос ВЫПОЛНЕН ПОВТОРНО. Сервер сам вам в грид ничего пихать не будет.
Ну собственно и что ? Когда человек говорит не верю смысл всего остального пропадает. Похрен на все, не верю!

Все просто.

if Edit_Grid.Fields[0].AsString <> '' then begin
str:= Main_form.arrangeword(Edit_Grid.Fields[0].AsString);
IBSDel.Script.Clear;
IBSDel.Script.Append('Delete from ' + str + ' where ' + str
+ 'text = ' + '''' + Edit_Grid.Fields[0].AsString + ''';');


IBDSetGrid.Close;
IBTrEdit.Commit;
if not IBTrDel.Active then IBTrDel.StartTransaction;
IBSDel.ExecuteScript;
IBTrDel.Commit;

IBTrEdit.StartTransaction;
IBDSetGrid.Open;


IBTrEdit - транзакция Грида.
IBTrDel - транзакция удаления.
Последний раз редактировалось Tizoc 24 ноя 2006, 15:13, всего редактировалось 1 раз.

Tizoc
Сообщения: 14
Зарегистрирован: 16 июн 2005, 20:24

Сообщение Tizoc » 24 ноя 2006, 14:22

kdv писал(а):
"Delete from xxx where something=xx" , ExecuteScript, Commit. Но к сути проблемы какое это отношение имеет ?
извините, но бредово это как то. не проще использовать IBQuery или вообще IBSQL? IBScript все-таки для выполнения скриптов предназначен, а не для выполнения одиночных запросов.
Что бредово ? Можно и Dataset и IBSql использовать, только по-другому, в IBSql как и в датасете по записям надо идти, по записям запроса, удалять при желании, мне это не удобно. Много разных таблиц для удаления. IBQuery ? Там еxecute, там executescript, все одно. Большой разницы не видно. И IBScript`ом я обычно не одиночные запросы выполняю, массовые вставки например, и он с этим отлично справляется вроде.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 24 ноя 2006, 16:59

Ну собственно и что ? Когда человек говорит не верю смысл всего остального пропадает. Похрен на все, не верю!
"не верю" потому что за 11 лет работы в саппорте IB/FB я в 90 случаев вижу, что человек утверждает одно, а на деле в коде у него совсем другое. И проблема решается когда 2-3 раза приходтся тыкать в одно и то же место, в то время как вопрошающий исступленно доказывает что у него все "правильно".

Из другого параллельного коннекта, приложения и т.п. вставленная запись видна?

p.s. просьба не буянить, и отвечать адекватно. тут никто никому ничего не должен - это ты хочешь решить свою проблему, и поэтому именно твоя задача 10 раз все перепроверить. Не нравятся ответы на форуме - welcome в платный support.
Можно и Dataset и IBSql использовать, только по-другому, в IBSql как и в датасете по записям надо идти, по записям запроса, удалять при желании, мне это не удобно.
собственно, если тебе по задаче так делать удобнее - никто тебя не заставляет делать иначе. Этот IBScript к вопросу не имеет никакого отношения.

Tizoc
Сообщения: 14
Зарегистрирован: 16 июн 2005, 20:24

Вот беспредел.

Сообщение Tizoc » 28 ноя 2006, 14:37

Действителльно какой-то бардак. После удаления записи и завершения транзакции сделанные изменения не видны в базе через IBConsole. После же того как закрыт коннект с базой, измененеия вступают в силу. Это что-то новенькое. Если же поставить на эту форму новый компонент IBDatabase то все работает как надо (ранее использовался компонент Database главной формы), то есть тот же код что я написал стал работать!
Это что же такое, ibscript при нахождении с IBDatabase на разных формах
не делает изменений до закрытия коннекта с базой, то есть после IBDatabase.Close ?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 28 ноя 2006, 23:42

фиг знает. весь IBX есть в исходниках, так что...

Фанис
Сообщения: 17
Зарегистрирован: 16 июн 2005, 19:28

Сообщение Фанис » 29 ноя 2006, 18:31

kdv писал(а):фиг знает. весь IBX есть в исходниках, так что...
Я не поленился и посмотрел... :-)
Там все просто - в скриптере два IBTransaction. Один явный, второй - неявный, приватный, работает при AutoDDL=true.
if AutoDDL then
FDDLQuery.Transaction := FDDLTransaction
else
FDDLQuery.Transaction := FTransaction;

Ведь ясно сказали, что ... хотя что я ...

Tizoc
Сообщения: 14
Зарегистрирован: 16 июн 2005, 20:24

Сообщение Tizoc » 30 ноя 2006, 15:51

Фанис писал(а):
kdv писал(а):фиг знает. весь IBX есть в исходниках, так что...
Я не поленился и посмотрел... :-)
Там все просто - в скриптере два IBTransaction. Один явный, второй - неявный, приватный, работает при AutoDDL=true.
if AutoDDL then
FDDLQuery.Transaction := FDDLTransaction
else
FDDLQuery.Transaction := FTransaction;

Ведь ясно сказали, что ... хотя что я ...
А что конкретно это значит в свете моего сообщения про IBScript и IBDatabase на разных формах и возникающую из-за этого проблему ?

Tizoc
Сообщения: 14
Зарегистрирован: 16 июн 2005, 20:24

Сообщение Tizoc » 30 ноя 2006, 16:13

Придется видимо в данном случае использовать IBQuery или IBSQL. Везде пишется про правильность использования для массовых вставок или массового удаления записей IBSQL, так как он небуферизирующий. Но оставим это, а посмотрим на с другой стороны. Мне удобно использовать для этого (массовых вставок и масс. удаления) IBScript, если бы не возникшая вышеописанная проблема.
В IBScript пишу просто:

Delete from *** ......;
Delete from *** ......;
...............................
...............................
Delete from *** ......;

IBScript.ExecuteScript;
IBTransaction.Commit;

или в случае с Insert`ом.

Insert into ..............;
Insert into ..............;
Insert into ..............;

IBScript.ExecuteScript;
IBTransaction.Commit;

IBSQL же набор из нескольких операторов не понимает.

Нужно писать:

Delete from *** ......;
затем IBSQL.SQL.ExecQuery;
IBSQL.SQL.Clear;
снова
Delete from *** ......;
и опять IBSQL.SQL.ExecQuery;
IBSQL.SQL.Clear;

Вот это и кажется несколько неудобным.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 30 ноя 2006, 16:49

Везде пишется про правильность использования для массовых вставок или массового удаления записей IBSQL, так как он небуферизирующий.
нет. это пишется про чтение и перебор записей, когда буферизация ДатаСета не нужна. Подобный бред про "массовые вставки или удаления" никто не пишет, т.к. никакого буфера на клиенте при вставках, обновлениях или удалениях нет и быть не может. Буфер есть только для чтения.
А что конкретно это значит в свете моего сообщения
IBScrip.AutoDDL:=False - пробовал?
IBSQL же набор из нескольких операторов не понимает.
да и IBScript не понимает. Он распарсивает операторы и выполняет их по одному точно так же как IBSQL. Для тебя, конечно, IBScript удобнее.
Но с точки зрения конечного общения с сервером - то же самое.
кстати, ничто не мешает оформить нужные вызовы IBSQL в процедурку, куда будешь просто передавать текст запроса:
ExecViaISQL('delete from ...');
ExecViaISQL('insert into...');
ISQL.Transaction.Commit;

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 30 ноя 2006, 16:59

Особенно фантастическое ускорение такой подход (что скриптом, что пересборкой) по сравнению с параметризованными запросами даёт в случае выполнения однотипных действий над одними и теми же объектами ;) А ещё некоторые извращенцы используют executable хранимые процедуры для сохранения изменений в разные объекты. Но это плохо - сетка разгружается, препарится всё один раз и махом, в итоге железо простаивает, скучает ;)

Tizoc
Сообщения: 14
Зарегистрирован: 16 июн 2005, 20:24

Сообщение Tizoc » 30 ноя 2006, 17:14

IBScrip.AutoDDL:=False - пробовал?

Да, пробовал. Не помогло.
кстати, ничто не мешает оформить нужные вызовы IBSQL в процедурку, куда будешь просто передавать текст запроса:
ExecViaISQL('delete from ...');
ExecViaISQL('insert into...');
ISQL.Transaction.Commit;

Этому конечно ничто не мешает, так и собираюсь делать.

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 01 дек 2006, 10:20

Merlin писал(а): А ещё некоторые извращенцы используют executable хранимые процедуры для сохранения изменений в разные объекты.
Ага, как я например, и для связаных апдэйдов, и для делетов, и для инсертов. :)

Ответить