标题:关于远程访问数据,如何完善事物管理
只看楼主
fanjinyu9108
Rank: 2
等 级:论坛游民
帖 子:644
专家分:20
注 册:2014-1-16
结帖率:88.5%
已结贴  问题点数:20 回复次数:14 
关于远程访问数据,如何完善事物管理
我有一个小程序,需要同时远程添加记录到一个表和修改另外一个表,我的要求是两个操作必须都执行成功,如果一个失败了,则另外一个也取消,请问应该怎么做,能否帮我完善下,我的代码如下:
程序代码:
                   thisform.Enabled=.f.  &&查询期间不能再点击
                  WAIT "请稍等,正在上传数据" WINDOW AT 25,85 nowait
                  thisform.lianjie  &&生成字符串
                  IF  nhandle<=0    &&连接不成功
                       wait clear
                       MESSAGEBOX("数据库连接失败!!!",0,"错误信息") 
                             
                  ELSE     &&连接成功
                                  PUBLIC ac1,ac2
                                  Ac2=SQLEXEC(nhandle,"insert into jl (dw,ch,wz,qf) values (?dw_mc,?ch_value,?ziduan_name,?ziduan_value)")
                          Ac1=SQLEXEC(nhandle,"update ygc set &ziduan=?ziduan_value,sj=?shijian_value  where id=?ygc_id ")
                               
                                
                                  IF  Ac1>0 AND ac2>0
                                       = SQLDISCONNECT(nhandle) &&关闭连接
                                      wait CLEAR  &&清除等待窗口
                                      success=.t.
                                      RELEASE thisform
                                  ELSE
                                       = SQLDISCONNECT(nhandle) &&关闭连接
                                       wait CLEAR  &&清除等待窗口
                                       success=.f.
                                       MESSAGEBOX("返填数据失败!",0,"错误信息") 
                                       thisform.refresh        
                          
                                  ENDIF
                              
                    
                  endif   &&连接结束
                
                    thisform.Enabled=.t.  &&恢复正常状态
搜索更多相关主题的帖子: 远程 数据 thisform WAIT 连接 
2019-08-08 13:57
厨师王德榜
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:183
帖 子:942
专家分:4724
注 册:2013-2-16
得分:3 
去看一下帮助文件,查一查 SQLCOMMIT( ) 和 SQLROLLBACK( )  两个的用法,你这个适合用事务管理,如果以前没有这方面的积累,需要你自己静下来看看.
一个是提交,另一个是回滚.
所以事务处理,最好包裹在try...end try 结构中进行,示例代码:
 SQLSETPROP(gnHandle, 'Transactions', 2)  && 定义事务处理的方式是通过"提交"或"回滚"
try
= SQLEXEC(gnHandle, "INSERT INTO authors (au_id, au_lname);
   VALUES ('aupoe', 'Poe')")  &&  
= SQLCOMMIT(gnHandle)  && 提交
catch ...
SQLROLLBACK( )  && 回滚
end try


[此贴子已经被作者于2019-8-13 13:31编辑过]

2019-08-13 13:27
wcx_cc
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:52
帖 子:352
专家分:1152
注 册:2015-10-2
得分:3 
使用连接的预编译语句!不要直接使用这种‘一步到位’式的操作, 比如:Ac1=SQLEXEC(nhandle, ...)"),Ac2=SQLEXEC(nhandle, ...)")。这2步都是一次到位的模式,想1次性同时进行两步处理,但还是分成了先后2次。请再仔细查阅帮助文件里的‘连接预编译语句’,应该能实现要求。(注:回滚与事务提交,比较适合于单次处理)


 
2019-08-13 22:10
radiofan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:466
专家分:696
注 册:2006-7-30
得分:3 
学习了
2019-08-14 08:41
xinjie
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:18
帖 子:257
专家分:501
注 册:2007-8-11
得分:3 
以下是引用厨师王德榜在2019-8-13 13:27:29的发言:

去看一下帮助文件,查一查 SQLCOMMIT( ) 和 SQLROLLBACK( )  两个的用法,你这个适合用事务管理,如果以前没有这方面的积累,需要你自己静下来看看.
一个是提交,另一个是回滚.
所以事务处理,最好包裹在try...end try 结构中进行,示例代码:
 SQLSETPROP(gnHandle, 'Transactions', 2)  && 定义事务处理的方式是通过"提交"或"回滚"
try
= SQLEXEC(gnHandle, "INSERT INTO authors (au_id, au_lname);
   VALUES ('aupoe', 'Poe')")  &&  
= SQLCOMMIT(gnHandle)  && 提交
catch ...
SQLROLLBACK( )  && 回滚
end try

确定在执行出错时可以抛出错误?
2019-08-14 12:02
xuminxz
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:40
帖 子:749
专家分:2475
注 册:2011-5-8
得分:3 
回复 5楼 xinjie
似乎不能100%保证吧?我一直用笨办法,更新远程,用远程刷新本地视图,比较结果。

dBase有人接盘了。
2019-08-15 15:44
radiofan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:466
专家分:696
注 册:2006-7-30
得分:0 
开始事物,完成所有数据操作,无误,完成事务并更新本地数据,其中任何一个有问题就回滚事务并不更新本地数据。我的系统就是这样做的。
2019-08-16 09:45
radiofan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:466
专家分:696
注 册:2006-7-30
得分:0 
以下是引用厨师王德榜在2019-8-13 13:27:29的发言:

去看一下帮助文件,查一查 SQLCOMMIT( ) 和 SQLROLLBACK( )  两个的用法,你这个适合用事务管理,如果以前没有这方面的积累,需要你自己静下来看看.
一个是提交,另一个是回滚.
所以事务处理,最好包裹在try...end try 结构中进行,示例代码:
 SQLSETPROP(gnHandle, 'Transactions', 2)  && 定义事务处理的方式是通过"提交"或"回滚"
try
= SQLEXEC(gnHandle, "INSERT INTO authors (au_id, au_lname);
   VALUES ('aupoe', 'Poe')")  &&  
= SQLCOMMIT(gnHandle)  && 提交
catch ...
SQLROLLBACK( )  && 回滚
end try



没错,就是这样的!
2019-08-16 09:46
fanjinyu9108
Rank: 2
等 级:论坛游民
帖 子:644
专家分:20
注 册:2014-1-16
得分:0 
这几天没有看帖子,以为没有人回帖,没有想到有这么多回帖,非常感谢,但我对这个还不怎么懂,要慢慢消化几天,等有疑问再出来,所以不能结贴,再次感谢
2019-08-18 15:23
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:3 
其实,楼主的问题,最简单的方法,就是把上面的,写出存储过程,在存储过程用事务处理。


SQL Server中@@ROWCOUNT返回受上一语句影响的行数,返回值类型为 int 整型。 如果行数大于 20 亿,则需要使用 ROWCOUNT_BIG。

@@ROWCOUNT和@@ERROR变量的值,在执行完一条语句后总是会发生变化,所以我们将他们作为判断的依据的时候应该首先保存在局部变量中。他们反映的都是紧接着的上一条语句对他们的影响!

我们通常可以通过update、insert语句并使用@@ROWCOUNT来检测是否更改了任何一些行。

[此贴子已经被作者于2019-8-20 08:51编辑过]

2019-08-20 08:33



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-496281-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.229356 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved