用begin trans的人小心啊!(100分)

  • 主题发起人 主题发起人 drinven
  • 开始时间 开始时间
D

drinven

Unregistered / Unconfirmed
GUEST, unregistred user!
我用c++ builder实现以下代码时﹐发现第一条sql语句执行正确﹐
而第二条sql语句由于主键重复所以执行错误﹐本来结果应该是有错误提示﹐但
实际上却无错误提示﹐更不要说rollback了﹐致使把现有数据delete了﹐却无insert记录﹐
害得我可惨了﹐高手们﹐这是何原因啊?
strSQL="delete supply_qty where trader_id='0005' and supp_no=15;
insert into supply_qty(trader_id,supp_no,item,col_id,siz_id,supp_qty)
select '0005',15, item,col_id,siz_id,sum(supp_qty) supp_qty
from ##suppdet group by trader_id,supp_no,item,col_id,siz_id ;"
try
ADOConnection1->begin
Trans;
ADOConnection1->Execute(strSQL);
ADOConnection1->CommitTrans;
catch (Exception &E)
{
ADOConnection1->RollbackTrans() ;
Application->MessageBox(("执行SQL语句错误,错误信息﹕"+E.Message).c_str(),"JMSYS",MB_OK);}
}
 
你应该两条Sql语句分开执行吧,不能放在一起执行.
 
不是吧,有这样的事,是C++Builder的BUG还是语句有问题啊?
 
begin
trans
delete supply_qty where trader_id='0005' and supp_no=15;
insert into supply_qty(trader_id,supp_no,item,col_id,siz_id,supp_qty)
select '0005',15, item,col_id,siz_id,sum(supp_qty) supp_qty
from ##suppdet group by trader_id,supp_no,item,col_id,siz_id
commit trans
if @@errors<>0
rollback trans
 
To xeen:
如果两条Sql语句分开执行﹐那就達不到同一個事務處理的效果了
 
如果两条Sql语句分开执行﹐那就達不到同一個事務處理的效果了//??????????
你还没搞懂什么是事务处理建议找本sql书看看
 
To chshanghai:
執行你的語句時出現以下錯誤﹕
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near 'trans'.
Server: Msg 170, Level 15, State 1, Line 6
Line 6: Incorrect syntax near 'trans'.
Server: Msg 137, Level 15, State 1, Line 7
Must declare the variable '@@errors'.
 
To 52free:
我的意思是同一個事務中﹐兩條sql語句要么都完成﹐要么都不完成﹐你有高見嗎?
 
用数据库的事物来处理吧
最前加个 begin
tran
最后加个commit tran
 
To Drinven:
在通一个事务中执行<>在同一条Sql语句中执行。
在事务开始后所有修改都将在Commit的时候提交,在RollBack的时候撤消。
大多数的数据库驱动程序都不支持把多条Sql语句放在一起执行,有可能产生
难于预料的后果.
 
你用的是什么数据库. 我这是sql server 7.0/2000下都成功了
 
分开写sql语句,只要处在一个事务中就可以了!
 
我用sql server 7.0
 
不好意思 .写错了 . 多加了几个 s
下面这个肯定可以
begin
tran
delete supply_qty where trader_id='0005' and supp_no=15;
insert into supply_qty(trader_id,supp_no,item,col_id,siz_id,supp_qty)
select '0005',15, item,col_id,siz_id,sum(supp_qty) supp_qty
from ##suppdet group by trader_id,supp_no,item,col_id,siz_id
commit tran
if @@error<>0
rollback tran
 
謝謝各位了
經測試發現兩條sql語句分開執行是可行的
但用數據庫本身的begin
tran在查詢分析器中執行就沒有達到rollback效果﹐而在c++ builder
中執行卻執行,很長時間后彈出錯誤﹕"Timeout Expired"
 
總結﹕用以上提到的兩種方法都可以
恭喜﹗都有分﹗
 
后退
顶部