导航
  • 主页
  • API 调用
  • 基础类
  • 控件与界面
  • 数据库相关
  • DataWindow
  • 项目管理
  • Web 应用
  • 脚本语言

pb 与sqlserver 过程的事务问题

sbigwolf 2003-12-17 08:10:09
我的问题是这样的:
当我们在MSSQLSERVER 中创建了一个存储过程,在pb 中,发现在过程执行完毕后,rollback or commit 对过程中修改的语句不起作用。
开始我们以为是autocommit=false在作怪,将autocommit =true ,但是一这样来,excute procedure后每法控制事物,又将autocommit=false ,发现我们直接rollback 后不起作用,但是disconnect using sqlca ,然后connect using sqlca 后我们的数据回滚了。如果要提交所做的修改,将autocommit=true数据就直接提交了。我想问如果要回滚,非要短开后重连吗?我原来在6.5 和 oracle中没有这样的问题。
...全文
6 点赞 收藏 7
写回复
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sbigwolf 2003-12-17
对,比如我在过程中发现某一个条件不对,我会将其不能执行的标志返回,在外边根据标志来进行提交与回滚,当然,在oracle中这个问题是不存在的:(存储过程和调用者是一体) 他们是分离的。我在oracle 的最后根据成功与否进行提交与回滚,然后把成功或失败的标志穿回来,前台只是根据穿出的是进行提示成功或失败。
在oracle 中
begin
...
...
if 成功 then
标志 = 1
else
标志 = 0
退出游标或者或者循环快
回到最后的判断语句。
end if
end
begin 2
.....
.....
.....

if 成功 then
标志 = 1
else
标志 = 0
退出游标或者或者循环快
回到最后的判断语句。
end if
end

//判断是否提交或回滚
if 标志 = 1 then
commit ;
标志 = 1 //要穿出
return
else
标志 = 0
rollback ;
return
end if
但是mssqlser却不能这样做
我搜索了很多帖子,都是关于pb调用mssqlserver 存储过程不能得到传出的问题。或者不能更改数据的疑问。
goodman520(云中月) 说得对,另外开一个事务可以,但是 如果要回滚,则应当回滚这个字定义事务,然后短开自定义事务,否则过程与所有的表极其资源处于锁定状态
如果要提交,也得象我在提交时这样写,否则数据的更改不会保存到表中去的。不知哪位能把这个机制讲清楚,偷窃。网上问pb调用mssqlserver存储过程的问题大多由此而来。
回复
banalman 2003-12-17
存储过程和调用者是一体,的。但是您不是根据判断sqlca.sqlcode 来是否进行事务提交。
回复
goodman520 2003-12-17
你可以自己创建一个新的事物对象!
回复
jdsnhan 2003-12-17
去掉所有的 using sqlca;
即 commit using sqlca 换成 commit; 试试看。
回复
sbigwolf 2003-12-17
过程是这样的
create procedure p_update @p_name varchar(10),@p_code varchar(10) output
as
begin
update s_oper set oper_name = @p_name
set @p_code = 'abcdef'
end
//pb
string ls_name ,ls_code
delcare my procedure for p_update
@p_name =:ls_name ,
@p_code =:ls_coce output
using sqlca ;
execute my ;
fetch my into :ls_code
if ls_code = 'abcdef' then
commit using sqlca;
messagebox("","")
else
rollback using sqlca ;
end if
//这样不行 ,数据更改不料。这样是可以的
sqlca.autocommit =false
execute my ;
fetch my into :ls_code
if ls_code = 'abcdef' then
commit using sqlca;
sqlca.autocommit = ture
sqlca.autocommit = false //数据可以更改到数据库中去
messagebox("","")
else
rollback using sqlca
disconnect using sqlca ;
connnect using sqlca //数据可以回滚
end if
回复
zhangdatou 2003-12-17
试试楼上的
回复
mittee 2003-12-17
sqlca.sqlcode <> -1 不可以判断吗?
回复
发动态
发帖子
PowerBuilder
创建于2007-09-28

808

社区成员

PowerBuilder 相关问题讨论
申请成为版主
社区公告
暂无公告