Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите! Какие-то проблемы с IBTransaction. [IB6.x, FirreBird]


NeyroSpace ©   (2002-11-19 17:41:00) 

Нужно вставить 1-ну запись в главную таблицу и n-записей в подчиненную.
Если я не глючу, то делается это так:
DataModule1.IBTransaction1.StartTransaction;
try
Pquery1.execsql(вставляем в главную)
...
Fquery1.execsql(вставляем в подчин)
...
FqueryN.execsql(вставляем в подчин)

DataModule1.IBTransaction1.Rollback;
except
DataModule1.IBTransaction1.Rollback;
end


У всех Fquery1 и Pquery1 указана IBTransaction1.
Но при выполнении DataModule1.IBTransaction1.StartTransaction;
Выдает ошибку: Transaction is active
Почему?


Олеся   (2002-11-21 05:37:00) [1]

>NeyroSpace
Если этот вопрос ко мне
>В IBUpdateSQLdocuments есть список параметров. Как до них >добраться?
>Делаю так, но не уверен, что правильно...
то лучше напиши, что тебе надо сделать, может здесь параметры совсем и не нужны (честно говоря мне ни разу не пришлось делать что-то подобное, хотя IBUpdateSQL использую довольно часто)


Alex-xxc   (2002-11-20 11:22:00) [2]

Я делаю следующим образом: в обработчике события OnSQLChanging у Query прописываю:

try
Query.CheckClosed;
except
Query.Close;
end;
if Query.Transaction.Active=False then Query.Transaction.StartTransaction;

при условии, что пользуештся TIBSQL. Единственное, за чем остается следить - это делать commit/rollback


NeyroSpace   (2002-11-20 10:40:00) [3]

1.
DataModule1.IBTransaction1.Commit; //Rollback <- опечатка :-\
except
DataModule1.IBTransaction1.Rollback;
end

2. Pquery1,Fquery1:TIBQuery

С Transaction is active разобрался...
>Олеся © (20.11.02 05:01) спасибо.

Тогда еще один вопросик.
В IBUpdateSQLdocuments есть список параметров. Как до них добраться?
Делаю так, но не уверен, что правильно...

//Устанавливаем значение внешнего ключа из главной таблицы
DataModule1.IBQueryDocuments.ParamByName("ID").AsInteger := iPARENT;
DataModule1.IBUpdateSQLdocuments.SetParams(ukInsert);
DataModule1.IBUpdateSQLdocuments.ExecSQL(ukInsert);
//IBQueryDocuments <-связан-> IBUpdateSQLdocuments


Dizzy   (2002-11-20 10:39:00) [4]

Я обычно делаю так:
if DataModule1.IBTransaction1.Active then
try
DataModule1.IBTransaction1.Commit;
except
DataModule1.IBTransaction1.Rollback;
end;

DataModule1.IBTransaction1.StartTransaction;
try
Pquery1.execsql(вставляем в главную)
...
Fquery1.execsql(вставляем в подчин)
...
FqueryN.execsql(вставляем в подчин)

DataModule1.IBTransaction1.Commit;
except
DataModule1.IBTransaction1.Rollback;
end
DataModule1.IBTransaction1.StartTransaction;

При этом TIBTransaction одна на весь проект.


Victor_Cr   (2002-11-20 08:48:00) [5]

2 Олеся © (20.11.02 05:01)
Это совсем не обызательно если транзакция у тебя выполняеться отдельной процедурой, и точка входа в StartTransaction...Commit(Rollback) единственная. За тебя все сделает блок try..except.

2 NeyroSpace © (19.11.02 17:41)

А ты действительно глючишь :-).

DataModule1.IBTransaction1.StartTransaction;
try
Pquery1.execsql(вставляем в главную)
...
Fquery1.execsql(вставляем в подчин)
...
FqueryN.execsql(вставляем в подчин)

DataModule1.IBTransaction1.Commit;
except
DataModule1.IBTransaction1.Rollback;
end


каким типом являються у тебя Pquery1,Fquery1,FqueryN. Если это обычные TQuery, то ты делаешь что-то дикое. Даже если в SQL тексте у них запросы на удаление, изменение, вставку...


Олеся   (2002-11-20 05:01:00) [6]

Всегда проверяю активновсть транзакции
if not IBTransaction1.active then IBTransaction1.StartTransaction

if IBTransaction1.active then IBTransaction1.Commit

if IBTransaction1.active then IBTransaction1.Rollback


oss   (2002-11-20 00:35:00) [7]

и стартует она сама


oss   (2002-11-20 00:33:00) [8]

try
Pquery1.execsql(вставляем в главную)
...
Fquery1.execsql(вставляем в подчин)
...
FqueryN.execsql(вставляем в подчин)

DataModule1.IBTransaction1. Rollback; // может commit ?
except
DataModule1.IBTransaction1.Rollback;
end



Prooksius   (2002-11-19 20:08:00) [9]

Потому, что ты уже стартовал ее когда-то.
Для изменений в базе лучше пользоваться отдельными транзакциями.
Тогда тебе не придется постоянно беспокоиться насчет этого.


Наверх

Титульная страница Поиск, карта сайта Написать письмо