//---------------------------------------------------------------------------
void __fastcall TFormCompDetail::dsmShow(TObject *Sender)
{
int trlev;
if(DataModule2->ADOConnection1->InTransaction==false)
{
trlev=DataModule2->ADOConnection1->BeginTrans();
//ShowMessage(IntToStr(trlev));
}
else
ShowMessage("begin transaction error");
}
//---------------------------------------------------------------------------
void __fastcall TFormCompDetail::FormClose(TObject *Sender,
TCloseAction &Action)
{
if(DataModule2->ADOConnection1->InTransaction==true)
{
DataModule2->ADOConnection1->RollbackTrans();
if(DataModule2->ADOConnection1->InTransaction==true)
ShowMessage("rollback transaction error");
}
}
//---------------------------------------------------------------------------
void __fastcall TFormCompDetail::btn_confirmClick(TObject *Sender)
{
if(DataModule2->ADOConnection1->InTransaction==true)
{
DataModule2->ADOConnection1->CommitTrans();
if(DataModule2->ADOConnection1->InTransaction==true)
ShowMessage("commit transaction error");
}
}
//---------------------------------------------------------------------------
void __fastcall TFormCompDetail::btn_cancelClick(TObject *Sender)
{
if(DataModule2->ADOConnection1->InTransaction==true)
{
DataModule2->ADOConnection1->RollbackTrans();
if(DataModule2->ADOConnection1->InTransaction==true)
ShowMessage("rollback transaction error");
}
FormCompDetail->Close();
}
//---------------------------------------------------------------------------
не происходит реального отката при Rollback'е (
Возможно я не правильно применяю этот инструмент, прошу помочь разобраться.
вот то, что в форме с ДБЕдитами:
Код:
З.Ы, доп вопрос - в хелпе написано, что РоллбАк при корректном резалте вызывает соответствующее событие и ставит InTransaction в TRUE, но у меня он после вызова ставит флаг в FALSE, соответствующее событие при этом генерируется, а значит сам роллбак сработал правильно - нестыковка..
если напрямую правишь таблицы через Edit/Post то может и не сработать транзакция... делай SQL в рамках транзакциии, так серверу понятней будет
Цитата: oxotnik333
если напрямую правишь таблицы через Edit/Post то может и не сработать транзакция... делай SQL в рамках транзакциии, так серверу понятней будет
Христос Воскрес!
Кроме того - сервер должен поддерживать механизм транзакций. А из поста автора не понятно с какой базой он работает.
Цитата:
делай SQL в рамках транзакциии, так серверу понятней будет
что вы хотите сказать? внутри транзакции править таблицу только sql-запросами?
Цитата: nevi
субд mssql, таблицы правятся через компоненты Data Controls
что вы хотите сказать? внутри транзакции править таблицу только sql-запросами?
что вы хотите сказать? внутри транзакции править таблицу только sql-запросами?
именно только через SQL, и лучше формировать транзакцию непосредственно в самом запросе
Код:
BEGIN TRAN T1
UPDATE table1 ...
BEGIN TRAN M2 WITH MARK
UPDATE table2 ...
SELECT * from table1
COMMIT TRAN M2
UPDATE table3 ...
COMMIT TRAN T1
UPDATE table1 ...
BEGIN TRAN M2 WITH MARK
UPDATE table2 ...
SELECT * from table1
COMMIT TRAN M2
UPDATE table3 ...
COMMIT TRAN T1
пока вы не ушли - можно еще вопрос?
если фильтр в АДОтайбле или адокьювери не дает результатов, то ДБГрид, зацепленный на эту таблицу всеравно выводит первую строчку из таблицы, при этом свойство RecordCount у таблиц как и полагается равно нулю. Никакие рефреши не действуют, открытие/закрытие тоже не помогает (