Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.04;
Скачать: [xml.tar.bz2];




Вниз

Interbase +Transaction.... 


$hade   (2002-01-03 08:08) [0]

Народ...Или лыжи не едут или где? :-)
Вощщем...Работаю с IB без BDE (через стандартные компоненты IB в Delphi)...Транзакции стартую и подтверждаю вручную (т.е NOAUTOCOMMIT )...тока вот я не понял где указать что не мне нужно именно NOAUTOCOMMIT? В BDEAdministrator ->Drivers ? так это на все Interbase"овские прогои как я понял...и какая гарантия что другая прога не поменяет настройки?



penguin   (2002-01-03 10:48) [1]

Вы указываете параметры только для того алиаса, с которым хотите работать. При этом на другие алиасы, в том числе Interbase, и в том числе на те другие алиасы, которые связаны с Вашей базой данных, эти изменения не распротраняются. Другие программы, работающие с Вашей БД через другие алиасы, ничего не почувствуют.



Davojan   (2002-01-03 11:13) [2]

О чём вы, народ? Какой BDEAdministrator? Какие Alias? Они тут вообще не причем. Ведь сказано ж было, что НЕ через BDE. Если испозьзуются компоненты IBExpress, то прога будет работать на клиенте, на котором не установлена BDE.
Насколько я знаю, при использовании этих компонентов и так никакого автокоммита не происходит. Явным признаком этого служит такой глюк: когда производится коммит или роллбэк, все наборы данных (IBTable, IBQuery и т.д.) почему-то разрывают связь с базой данных и их приходится коннектить заново и возращать на место указатели. Выглядит это примерно так (я объединяю этот процесс в одну процедуру):
procedure TDM.Commit;
const BMCOUNT = 3;
var bm:array[1..BMCOUNT] of TBookMark;
begin
try
bm[1] := quGroups. GetBookmark;
bm[2] := quGoods. GetBookmark;
bm[3] := quGoodsPrices.GetBookmark;
trShopNet.Commit;
try
quGroups.Open;
quGroups. GotoBookmark(bm[1]);
quGoods.Open;
quGoods. GotoBookmark(bm[2]);
quGoodsPrices.Open;
quGoodsPrices.GotoBookmark(bm[3]);
except
end
finally
quGroups. FreeBookmark(bm[1]);
quGoods. FreeBookmark(bm[2]);
quGoodsPrices.FreeBookmark(bm[3]);
end
end;



kaif   (2002-01-03 15:42) [3]

Чтобы после Commit не закрывались запросы, нужно использовать не Commit, а CommitRetaining. Аналогично, вместо Rollback нужно использовать RollbackRetaining (но последнее работает только с IB6.0). Любой Open компонентов TIBQuery автоматически вызывает StartTransaction соответствующего TIBTransaction. Если нужно явно стартовать транзакцию, например, перед "INSERT INTO..." используйте метод TIBTransaction.StartTransaction. До этого всегда желательно проверить, что Transaction.UnTransaction <> True. Никаких Autocommit в IBExpress нет. Это всегда делается вручную, даже в утилитах типа IBSQL. Вообще Autocommit используют только для DDL (для "CREATE TABLE..." и.п. команд).



kaif   (2002-01-03 15:43) [4]

Простите, описался.
Transaction.InTransaction
:))



Davojan   (2002-01-04 12:39) [5]

Спасибо за совет, но я знал про CommitRetaining. Его в моем случае неудобно было использовать, потому что в основном все операции производил через хранимые процедуры, а если использовать эту процедуру, то изменения не отобразятся в наборе данных.
И вообще, это неудобно, если сервер сам производит какие либо изменения (например триггер формирует уникальный ключ), потому что об этом опять же не узнаёт набор данных клиента.



kaif   (2002-01-04 14:32) [6]

Согласен, есть такая проблема. Нужно разделить понятия Commit и Refresh. Как правило, я поступаю так:
1. Использую свойство Generator компонента TIBQuery, чтобы не получать уникальный ключ в триггере, а потом искать запись по альтернативным ключам, к тому же не всегда таковые можно сыскать...
2. Использую метод Refresh компонента TIBQuery. чтобы все это заработало, использую дополнительно компонент типа IBUpdateSQL. Разумеется, Refresh пересвечивает только текущую строку набора. Это происходит даже без Commit и результаты работы хранимой процедуры видны, если она в той же транзакции, что и запрос. Если что-то не так, то, как правило, это ошибка в тексте RefreshSQL.
Но я не наставиваю на таких решениях. Возможно, я просто не умею пользоваться закладками.




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.04;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.027 c
6-8959            UnderSun              2001-11-09 14:56  2002.02.04  
Про выделенную линию


4-9028            fag2000@ok.ru         2001-12-07 12:44  2002.02.04  
Как удалить OLE объект во время выполнения его метода


3-8789            Akimpinpavel          2002-01-08 12:22  2002.02.04  
Как связать Delphi с базой данныx Access


3-8759            Ars P                 2002-01-04 13:30  2002.02.04  
BDE Error!


4-9029            irq                   2001-12-04 17:49  2002.02.04  
Процессы