NO USER TRANSACTION IS CURRENTLY IN PROGRESS (100分)

  • 主题发起人 主题发起人 qinmingzsj
  • 开始时间 开始时间
Q

qinmingzsj

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大俠:
我的程序在按 "保存"時,有時出現"NO USER TRANSACTION IS CURRENTLY IN PROGRESS "
這個提示,我不知道問題出在哪里,希望能給我一點提示!
我的原代碼如下:
if GSDDATAMOD.GSDCUSTDB.InTransaction = true then
GSDDATAMOD.GSDCUSTDB.RollBack;
GSDDATAMOD.GSDCUSTDB.StartTransaction;
Qry_GS_MAKEHEAD.ApplyUpdates;
arraytoqry(Qry_GS_COLOR_CODEDOC_insert, Qry_GS_MAKEHEAD);(這個函數是表Qry_GS_MAKEHEAD 里插入數據)
Qry_GS_COLOR_CODEDOC_insert.ApplyUpdates;
Qry_GS_MERCERYDOC_insert.ApplyUpdates;
// Qry_GS_SIZESPECDOC_insert.ApplyUpdates;
GSDDATAMOD.GSDCUSTDB.Commit;
Qry_GS_COLOR_CODEDOC_insert.CommitUpdates;
Qry_GS_MERCERYDOC_insert.CommitUpdates;
Qry_GS_COLOR_CODEDOC.ParamByName('computer_id').AsString := Qry_GS_MAKEHEAD.FieldBYNAME('COMPUTER_ID').AsString;
Qry_GS_COLOR_CODEDOC.close;
Qry_GS_COLOR_CODEDOC.Open;
Qry_GS_MERCERYDOC.ParamByName('computer_id').AsString := Qry_GS_MAKEHEAD.FieldBYNAME('COMPUTER_ID').AsString;
Qry_GS_MERCERYDOC.close;
Qry_GS_MERCERYDOC.Open;
// Qry_GS_SIZESPECDOC.ParamByName('computer_id').AsString := Qry_GS_MAKEHEAD.Fields[0].AsString;
// Qry_GS_SIZESPECDOC.close;
// Qry_GS_SIZESPECDOC.Open;
Qry_GS_MERCERYDOC_insert.close;
Qry_GS_SIZESPECDOC_insert.close;
InsertFlag := 0;
computer_id := '';
make_info := '';
COPYflag := 0;
end;
except
begin
GSDDATAMOD.GSDCUSTDB.Rollback;
MessageBox(Application.Handle, pchar('保存出現錯誤﹐請仔細檢查后再保存'), '錯誤', MB_OK);
end;




 
没看出具体毛病,你的Try不知道放在那里了?加上我写的那句话,实验一下
except
if GSDDATAMOD.GSDCUSTDB.InTransaction then//加上这句
GSDDATAMOD.GSDCUSTDB.Rollback;
MessageBox(Application.Handle, pchar('保存出現錯誤﹐請仔細檢查后再保存'), '錯誤', MB_OK);
end;
 
try
if GSDDATAMOD.GSDCUSTDB.InTransaction = true then
GSDDATAMOD.GSDCUSTDB.RollBack;
GSDDATAMOD.GSDCUSTDB.StartTransaction;
Qry_GS_MAKEHEAD.ApplyUpdates;
arraytoqry(Qry_GS_COLOR_CODEDOC_insert, Qry_GS_MAKEHEAD);(這個函數是表Qry_GS_MAKEHEAD 里插入數據)
Qry_GS_COLOR_CODEDOC_insert.ApplyUpdates;
Qry_GS_MERCERYDOC_insert.ApplyUpdates;
// Qry_GS_SIZESPECDOC_insert.ApplyUpdates;
GSDDATAMOD.GSDCUSTDB.Commit;
Qry_GS_COLOR_CODEDOC_insert.CommitUpdates;
Qry_GS_MERCERYDOC_insert.CommitUpdates;
Qry_GS_COLOR_CODEDOC.ParamByName('computer_id').AsString := Qry_GS_MAKEHEAD.FieldBYNAME('COMPUTER_ID').AsString;
Qry_GS_COLOR_CODEDOC.close;
Qry_GS_COLOR_CODEDOC.Open;
Qry_GS_MERCERYDOC.ParamByName('computer_id').AsString := Qry_GS_MAKEHEAD.FieldBYNAME('COMPUTER_ID').AsString;
Qry_GS_MERCERYDOC.close;
Qry_GS_MERCERYDOC.Open;
// Qry_GS_SIZESPECDOC.ParamByName('computer_id').AsString := Qry_GS_MAKEHEAD.Fields[0].AsString;
// Qry_GS_SIZESPECDOC.close;
// Qry_GS_SIZESPECDOC.Open;
Qry_GS_MERCERYDOC_insert.close;
Qry_GS_SIZESPECDOC_insert.close;
InsertFlag := 0;
computer_id := '';
make_info := '';
COPYflag := 0;
end;
except
begin
GSDDATAMOD.GSDCUSTDB.Rollback;
MessageBox(Application.Handle, pchar('保存出現錯誤﹐請仔細檢查后再保存'), '錯誤', MB_OK);
end;
end;
 
你是一次都没成功吗? 我碰到过一样的报错!原因是后台进程回滚造成的。等待一段时间就
好了!我是SYBASE数据库
 
players:
不是每次都是這樣,是偶爾有這樣的抱錯!


 
其实你的很多Close、Open操作都可以放置在事务以外进行。
尽量精简一下事务内部的处理。
还有,其他地方是否存在同样的事务处理?出现错误是否是在执行Except后?
 
yzhshi:
謝謝你的提示,我應該是把很多Close、Open操作都可以放置在事务以外进行的!

但是這個錯誤他是在 TRY 和 Except 中出現的,不是在Except后!
 
学习迥异代码,风格与我完全不同啊~~~~~~~~~~~

一个字,看起来累~~~~~~~~~~~~~~~
 
1.是否在其它调用的函数中调用了DDL语句,导致隐含事务自动提交,而你在后来的时候又
commit,就会报错!(例如更改字段名称,在数据库中创建一个新表)
2.是否使用了嵌套事务,而又用一个DATABASE构件来做这个操作,例如在其它函数中曾经使用了
commit做显式提交。
总而言之注意是否在已经提交了事务的时候再提交,或事务没有开始就用rollback也会导致这个
错误!你的代码太乱了,还是自己按照上面几点自己看吧!
 
例如在你的commit语句和你的except之间的代码如果出现异常的话就会运行到
except
begin
GSDDATAMOD.GSDCUSTDB.Rollback;《-----此时事务已经提交,根本没有事务可回滚,就会报错!!
MessageBox(Application.Handle, pchar('保存出現錯誤﹐請仔細檢查后再保存'), '錯誤', MB_OK);
end;
end;
你的异常处理机制不是很好,会有BUG出现!这就可能是一个!
 
多人接受答案了。
 
后退
顶部