Странное поведение компонентов IBX ?
Модератор: kdv
Странное поведение компонентов IBX ?
Сервер IB7.5.1.162. IBX 7.09. Delphi 7(Build 8.1).
Есть приложение. TIBDatabasе, транзакции, датасеты, все это расположено на главной форме. Есть вторая форма, форма с DBGrid`ом, она использует TIBDatabase главной формы, но имеет свои TIBTransaction, TIBDataset, TIBScript и тд. Вторая форма модальная. При ее открытие открывается база, транзакция, датасет, данные показываются в гриде, при закрытии соответственно все закрывается. При удалении записи, используя IBScript модальной формы, после закрытия и открытия транзакции, после переоткрытия датасета, в Гриде информация не обновляется!. Приехали ?! В чем может быть проблема ?
Есть приложение. TIBDatabasе, транзакции, датасеты, все это расположено на главной форме. Есть вторая форма, форма с DBGrid`ом, она использует TIBDatabase главной формы, но имеет свои TIBTransaction, TIBDataset, TIBScript и тд. Вторая форма модальная. При ее открытие открывается база, транзакция, датасет, данные показываются в гриде, при закрытии соответственно все закрывается. При удалении записи, используя IBScript модальной формы, после закрытия и открытия транзакции, после переоткрытия датасета, в Гриде информация не обновляется!. Приехали ?! В чем может быть проблема ?
www.ibase.ru/devinfo/ibx.htm#ibtransaction
плюс www.ibase.ru/devinfo/ibtrans.htm про уровни изолированности.
плюс www.ibase.ru/devinfo/ibtrans.htm про уровни изолированности.
Re: Странное поведение компонентов IBX ?
Какова необходимость удалять запись используя именно IBScript?Tizoc писал(а):При удалении записи, используя IBScript модальной формы
Спасибо, конечно, но все это я уже читал. И игра настройками транзакции (что Snapshot, что Read Comitted) тут не помогает. И та что Snapshot (concurrency no_wait) должна работать судя по описаниям, так как изменения в базу внесены, Commit сделан, транзакция, с которой связан датасет и Грид, стартуется заново, соответственно должна видеть все изменения и получить обновленный TIP.kdv писал(а):www.ibase.ru/devinfo/ibx.htm#ibtransaction
плюс www.ibase.ru/devinfo/ibtrans.htm про уровни изолированности.
Re: Странное поведение компонентов IBX ?
Потому что удобнее. Запрос на показ записей в Гриде идет в c union`амиWildSery писал(а):Какова необходимость удалять запись используя именно IBScript?Tizoc писал(а):При удалении записи, используя IBScript модальной формы
ко многим таблицам, соответвтенно и удалять в датасете все это просто так нельзя. А в IBSctipt все просто и удобно, узнал что за запись... и go.
"Delete from xxx where something=xx" , ExecuteScript, Commit. Но к сути проблемы какое это отношение имеет ?
Ну собственно и что ? Когда человек говорит не верю смысл всего остального пропадает. Похрен на все, не верю!kdv писал(а):не верю. если запись вставлена в одной транзакции, и сделан commit, то эта запись будет видна в другой транзакции, если она read committed, и если запрос ВЫПОЛНЕН ПОВТОРНО. Сервер сам вам в грид ничего пихать не будет.И игра настройками транзакции (что Snapshot, что Read Comitted) тут не помогает.
Все просто.
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 раз.
Что бредово ? Можно и Dataset и IBSql использовать, только по-другому, в IBSql как и в датасете по записям надо идти, по записям запроса, удалять при желании, мне это не удобно. Много разных таблиц для удаления. IBQuery ? Там еxecute, там executescript, все одно. Большой разницы не видно. И IBScript`ом я обычно не одиночные запросы выполняю, массовые вставки например, и он с этим отлично справляется вроде.kdv писал(а):извините, но бредово это как то. не проще использовать IBQuery или вообще IBSQL? IBScript все-таки для выполнения скриптов предназначен, а не для выполнения одиночных запросов."Delete from xxx where something=xx" , ExecuteScript, Commit. Но к сути проблемы какое это отношение имеет ?
"не верю" потому что за 11 лет работы в саппорте IB/FB я в 90 случаев вижу, что человек утверждает одно, а на деле в коде у него совсем другое. И проблема решается когда 2-3 раза приходтся тыкать в одно и то же место, в то время как вопрошающий исступленно доказывает что у него все "правильно".Ну собственно и что ? Когда человек говорит не верю смысл всего остального пропадает. Похрен на все, не верю!
Из другого параллельного коннекта, приложения и т.п. вставленная запись видна?
p.s. просьба не буянить, и отвечать адекватно. тут никто никому ничего не должен - это ты хочешь решить свою проблему, и поэтому именно твоя задача 10 раз все перепроверить. Не нравятся ответы на форуме - welcome в платный support.
собственно, если тебе по задаче так делать удобнее - никто тебя не заставляет делать иначе. Этот IBScript к вопросу не имеет никакого отношения.Можно и Dataset и IBSql использовать, только по-другому, в IBSql как и в датасете по записям надо идти, по записям запроса, удалять при желании, мне это не удобно.
Вот беспредел.
Действителльно какой-то бардак. После удаления записи и завершения транзакции сделанные изменения не видны в базе через IBConsole. После же того как закрыт коннект с базой, измененеия вступают в силу. Это что-то новенькое. Если же поставить на эту форму новый компонент IBDatabase то все работает как надо (ранее использовался компонент Database главной формы), то есть тот же код что я написал стал работать!
Это что же такое, ibscript при нахождении с IBDatabase на разных формах
не делает изменений до закрытия коннекта с базой, то есть после IBDatabase.Close ?
Это что же такое, ibscript при нахождении с IBDatabase на разных формах
не делает изменений до закрытия коннекта с базой, то есть после IBDatabase.Close ?
Я не поленился и посмотрел...kdv писал(а):фиг знает. весь IBX есть в исходниках, так что...

Там все просто - в скриптере два IBTransaction. Один явный, второй - неявный, приватный, работает при AutoDDL=true.
if AutoDDL then
FDDLQuery.Transaction := FDDLTransaction
else
FDDLQuery.Transaction := FTransaction;
Ведь ясно сказали, что ... хотя что я ...
А что конкретно это значит в свете моего сообщения про IBScript и IBDatabase на разных формах и возникающую из-за этого проблему ?Фанис писал(а):Я не поленился и посмотрел...kdv писал(а):фиг знает. весь IBX есть в исходниках, так что...
Там все просто - в скриптере два IBTransaction. Один явный, второй - неявный, приватный, работает при AutoDDL=true.
if AutoDDL then
FDDLQuery.Transaction := FDDLTransaction
else
FDDLQuery.Transaction := FTransaction;
Ведь ясно сказали, что ... хотя что я ...
Придется видимо в данном случае использовать 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;
Вот это и кажется несколько неудобным.
В 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;
Вот это и кажется несколько неудобным.
нет. это пишется про чтение и перебор записей, когда буферизация ДатаСета не нужна. Подобный бред про "массовые вставки или удаления" никто не пишет, т.к. никакого буфера на клиенте при вставках, обновлениях или удалениях нет и быть не может. Буфер есть только для чтения.Везде пишется про правильность использования для массовых вставок или массового удаления записей IBSQL, так как он небуферизирующий.
IBScrip.AutoDDL:=False - пробовал?А что конкретно это значит в свете моего сообщения
да и IBScript не понимает. Он распарсивает операторы и выполняет их по одному точно так же как IBSQL. Для тебя, конечно, IBScript удобнее.IBSQL же набор из нескольких операторов не понимает.
Но с точки зрения конечного общения с сервером - то же самое.
кстати, ничто не мешает оформить нужные вызовы IBSQL в процедурку, куда будешь просто передавать текст запроса:
ExecViaISQL('delete from ...');
ExecViaISQL('insert into...');
ISQL.Transaction.Commit;
Особенно фантастическое ускорение такой подход (что скриптом, что пересборкой) по сравнению с параметризованными запросами даёт в случае выполнения однотипных действий над одними и теми же объектами
А ещё некоторые извращенцы используют executable хранимые процедуры для сохранения изменений в разные объекты. Но это плохо - сетка разгружается, препарится всё один раз и махом, в итоге железо простаивает, скучает 


IBScrip.AutoDDL:=False - пробовал?
Да, пробовал. Не помогло.
кстати, ничто не мешает оформить нужные вызовы IBSQL в процедурку, куда будешь просто передавать текст запроса:
ExecViaISQL('delete from ...');
ExecViaISQL('insert into...');
ISQL.Transaction.Commit;
Этому конечно ничто не мешает, так и собираюсь делать.
-
- Заслуженный разработчик
- Сообщения: 644
- Зарегистрирован: 15 фев 2005, 11:34