hur.cn - 华软网

 热门搜索

请教: 关于手动开始一个事务的问题??

  作者:未知    来源:网络    更新时间:2018/10/11
我在程序中这样起头一个事务:
ls_sql = "BEGIN TRANSACTION"
EXECUTE IMMEDIATE  :ls_sql USING SQLCA;  //起头一个事务
................          //多句写数据库SQL语句
if SQLCA.SQLCode <> 0 then 
messageBox ("数据库毛病", "XXXX !~r~n~r~n毛病代码:" + &
  string (sqlca.sqlDbCode) + "~r~n详细信息:" + & 
  sqlca.sqlERRText, stopSign!)
rollback using sqlca;
return -1
else
commit USING SQLCA;
return 1
end if

然则发现最终没有提交 (SQLCA.SQLCode =0),也没提醒所有毛病,(在SQL查询分析器里能够发现没有COMMIT)

如果把 "EXECUTE IMMEDIATE  :ls_sql USING SQLCA;  //起头一个事务"
这句注释掉的话反而能够正确提交了


请问是什么原因?   究竟有没需要执行: EXECUTE IMMEDIATE  :ls_sql USING SQLCA; 
//autoCommit = false

------华软网友回答------
我是富贵
------华软网友回复------
哈哈
------华软网友回复------
你不要搞复杂了。
PB会管理的,你只需根据sqlca.sqlcode的状态来决意commit 照旧rollback.
------华软网友回复------
晕,不需要这么麻烦的,设置:
autocommit = false
.......   //多句写数据库的SQL语句
if SQLCA.SQLCode <> 0 then 
messageBox ("数据库毛病", "XXXX !~r~n~r~n毛病代码:" + &
  string (sqlca.sqlDbCode) + "~r~n详细信息:" + & 
  sqlca.sqlERRText, stopSign!)
rollback using sqlca;
return -1
else
commit USING SQLCA;
return 1
end if

------华软网友回复------
好  多谢  明天揭贴

真有点晕   感觉自己做程序多了人都变得迂腐了   靠.............
------华软网友回复------
支持 redriver_liu(红河) 的说法
------华软网友回复------
如果楼主一定要用BEGIN TRANSACTION的话也能够用以下方法
ls_sql = "BEGIN TRANSACTION"
EXECUTE IMMEDIATE  :ls_sql USING SQLCA;  //起头一个事务
...
...
ls_sql = "Commit TRANSACTION"
EXECUTE IMMEDIATE  :ls_sql USING SQLCA; //提交事务.

然则不建议运用这类方法,不同的数据库能够效果会不同的,况且不是所有的数据库都支持这类语句。 


 redriver_liu(红河) 的方法才是好的方法。
     
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。