VFP双表事务处理,双表是指本地表和远程表同时加上事务,这样本地表和远程表,要么同时成功,要么同时失败。
事务是为了保证所处理数据的完整性,如n个相关表被同时修改,在保存数据时,要么全部保存,要么都不保存,这只有用事务来实现。
举例:
入库单增加了一个物料,库存表的相应也应该增加。如果入库单保存成功,库存表没有保存成功,便会出现数据不一致。而加上事务之后,如果库存表没有保存成功,入库单的数据也会回滚,便不保存。
用try结构来处理事务,比用IF每句判断要简单明快得多,我见过许多人写的事务,那个就复杂,看得头晕晕的。
VFP双表事务
Begin Transaction &&临时表事务
Try
SQLSetprop(nDatasource,'transactions',2) &&手动事务处理
*-- 此处保存的相关代码
Sqlcommit(nDatasource)
SQLSetprop(nDatasource,'transactions',1) &&自动事务处理
End Transaction &&临时表事务结束
Catch To ex
ROLLBACK
Sqlrollback(nDatasource) &&出错了,则事务回滚
SQLSetprop(nDatasource,'transactions',1) &&自动事务处理
?ex.Message
Endtry
Begin Transaction &&临时表事务
Try
SQLSetprop(nDatasource,'transactions',2) &&手动事务处理
*-- 此处保存的相关代码
This.AfterSave()
Sqlcommit(nDatasource)
SQLSetprop(nDatasource,'transactions',1) &&自动事务处理
End Transaction &&临时表事务结束
Catch To ex
llSaveSuccess =.F.
ROLLBACK
Sqlrollback(nDatasource) &&出错了,则事务回滚
SQLSetprop(nDatasource,'transactions',1) &&自动事务处理
*Throw ex
?ex.Message
EndtryBegin Transaction &&临时表事务
Try
SQLSetprop(nDatasource,'transactions',2) &&手动事务处理
*-- 此处保存的相关代码
This.AfterSave()
Sqlcommit(nDatasource)
SQLSetprop(nDatasource,'transactions',1) &&自动事务处理
End Transaction &&临时表事务结束
Catch To ex
llSaveSuccess =.F.
ROLLBACK
Sqlrollback(nDatasource) &&出错了,则事务回滚
SQLSetprop(nDatasource,'transactions',1) &&自动事务处理
*Throw ex
?ex.Message
Endtry
在猫框中,想要协调DAL_CA与MSSQLhelper同时拥有事务,只要他们在同一个句柄下就可以操作啦。
oDBSQLhelper=newobject("mssqlhelper","mssqlhelper.prg")
?oDBSQLhelper.datasource && mssqlhelper自动创建的句柄
oDAL_CA=newobject("dal_ryxx","dal_ryxx.prg","",oDBSQLHelper.datasource)
oDBSQLhelper2=newobject("mssqlhelper","mssqlhelper.prg","",oDBSQLHelper.datasource)
这样oDBSQLhelper,oDAL_CA,oDBSQLhelper2 都处于同一句柄,随时开启事务,一起愉快玩耍。
对了,在框架中,其实连事务都可以不用写,直接SAVE就好。