![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по транзакции в InterBase [D6, IB6.x]
АТ © (2003-05-27 04:24:00)Пользователь заполняет данными несколько форм. После этого он нажимает на кнопку и все изменения сохраняются. Предполагается, что чтобы отобразить все изменения в базе надо выполнить несколько SQL-запросов, а между ними еще и посчитать что-нибудь. Хочу чтобы чтобы все изменения выполнялись в рамках одной транзакции.
Если я последовательно выполню ряд динамических SQL-запросов через компонент IBQuery в свойстве Transaction которого будет указан компонент IBTransaction. То по идее транзакция перед началом первого запроса должна открыться, а закрыться только тогда, когда я ее закрою по Commit, пропустив через себя все мои запросы не закрываясь. Так-ли это? (св-во AutoStopAction компонента IBTransaction установлен в saNone)
Danilka (2003-05-27 10:31:00) [1]Жук © (27.05.03 10:20)
Вроде со скоростью пока все ок, тормозов, или еще чего не заметил.
Жук (2003-05-27 10:20:00) [2]Тогда, наверное, оптимальный вариант :
1) Вставка Append"ом
2) Редактирование как
> xmrz (27.05.03 08:59)
> Danilka © (27.05.03 09:57)
> Вообще, я делаю так:
А на скорость это не влияет ?
xmrz (2003-05-27 10:02:00) [3]>Жук © (27.05.03 09:54)
1) bookmark больше подходит конечно при редактировании записей.
2) набор данных я обычно строю с сортировкой по времени вставки, поэтому если открыть его с преждними параметрами (при условии что в запросе нет условия которое отбросит свежевставленное значение как не удовлетворяющее выборке) и сделать ему Last, то курсор окажется как раз на нужной записи. Если же сортировка идёт не по времени вставки, тогда хранимая процедура должна возвращать ID вставленных данных, и потом в открытом НД ищи по этому ID через Locate.
Danilka (2003-05-27 09:58:00) [4]Жук © (27.05.03 09:55)
ну, тогда моя ссылка устарела.
Danilka (2003-05-27 09:57:00) [5]Вообще, я делаю так:
открываю транзакцию на чтение,
делаю активным IBQuery, на него у меня повешен ClientDataSet через DataSetProvider, который я тоже делаю активным.
закрываю IBQuery, завершаю транзакцию.
ClientDataSet, при этом остается активным, и в нем есть все записи, которые были в IBQuery.
А дальше уж можно делать с этими данными все что угодно.
Если юзеру надо записать данные, запуск транзакции, запись измененных данных и завершение транзакции происходят в одной процедуре.
Жук (2003-05-27 09:55:00) [6]
> Danilka © (27.05.03 09:31)
> Жук © (27.05.03 09:25)
> Наверно. Под IBX я понимаю стандартные дельфовые компоненты
> работы с IB, которые лежат на закладке InterBase.
Угу. Понял. В Д6 неявные транзакции откатываются без проблем.
Жук (2003-05-27 09:54:00) [7]
> xmrz (27.05.03 09:48)
> Используй bookmark
1) Когда НД закрывается новой записи ещё нет, значит марка не поможет.
2) Записи НД где-то отображаются (z.b. грид). С какими параметрами вы переоткрываете НД ? Ведь свежевнесённая запись обязательно должна отобразиться.
xmrz (2003-05-27 09:48:00) [8]Используй bookmark:
...
var i : pointer;
begin
i := DepDS.DataSet.GetBookmark;
ShowCurrent;
if Assigned(i) then
if DepDS.DataSet.BookmarkValid(i) then DepDS.DataSet.GotoBookmark(i);
...
Жук (2003-05-27 09:45:00) [9]
> xmrz (27.05.03 09:31)
> > Жук
> В смысле?
Вы ж говорите, что при вводе новой записи (данных в форму ввода) закрываете НД. Когда форма ввода закрывается, то его надо переоткрыть (с какими параметрами ?) и спозиционировать курсор на введённую запись. Так ?
xmrz (2003-05-27 09:31:00) [10]> Жук
В смысле?
Danilka (2003-05-27 09:31:00) [11]Жук © (27.05.03 09:25)
Наверно. Под IBX я понимаю стандартные дельфовые компоненты работы с IB, которые лежат на закладке InterBase.
Может, чего-то путаю :)) недавно начал с IB работать.
Жук (2003-05-27 09:26:00) [12]
> xmrz (27.05.03 09:23)
Но остаётся вопрос с позиционированием курсора :-(
Жук (2003-05-27 09:25:00) [13]
> Danilka © (27.05.03 09:21)
По-моему мы в терминологии запутались...
xmrz (2003-05-27 09:23:00) [14]> Жук
Самый большой плюс этого подхода очевиден в ситуации, когда тебе надо вставить сразу несколько записей со связью один_ко_многоим. Типа :
- клиент
- заявка 1
- заявка 2
- заявка 3
В несколько разных таблиц
Danilka (2003-05-27 09:21:00) [15]Жук © (27.05.03 09:16)
>А при чём здесь IBX ?
IBQuery, IBTransaction - это не IBX?
по-моему, в другие компоненты (тот-же FIBPlus) по другому называются.
Жук (2003-05-27 09:16:00) [16]
> xmrz (27.05.03 08:59)
Интересная идея ! Надо попробовать.
> Danilka © (27.05.03 09:05)
А при чём здесь IBX ? Автор указал, что у него IB6, а там другая картина с неявными трензакциями.
Danilka (2003-05-27 09:09:00) [17]xmrz (27.05.03 08:59)
угу. по-моему, самый правильный вариант.
Danilka (2003-05-27 09:05:00) [18]Жук © (27.05.03 08:53)
а может потому что у тебя не IBX, а что-то другое?
;))
посмотри исходники IBX.
сейчас только что проверил, на форму повесил IBTable, IBDatabase, IBTarsaction, грид и кнопку.
в обработчике кнопки написал:
IBTransaction1.Rollback;
запустил, добавил в гриде несколько записей, нажал на кнопку, транзакция завершилась, датасет - IBTable, естесственно закрылся. Запускаю по-новому - записи на месте.
Правда, у меня Д5 а не Д6, но сомневаюсь, что там IBX изменился.
xmrz (2003-05-27 08:59:00) [19]По моему оставлять набор данных открытым во время заполнения форм - расточительно. Я обычно записываю промежуточные результате в собственной структуре данных, делаю любые промежуточные расчёты, а потом вставка (редактирование) данных через хранимую процедуру, после этого сразу commit. А если пользователь нажал отменить, то хранимая процедура не выполняется, а структура с данными - освобождается.
Жук (2003-05-27 08:53:00) [20]
> Danilka © (27.05.03 07:38)
А я и не знал ! Может по этому откатывалось всё без проблем ?