当前位置: 代码迷 >> VFP >> 对远程视图进行数据修改后发现修改错了,怎么恢复修改前的数据
  详细解决方案

对远程视图进行数据修改后发现修改错了,怎么恢复修改前的数据

热度:1689   发布时间:2013-02-26 00:00:00.0
对远程视图进行数据修改后发现修改错了,如何恢复修改前的数据?
我用VFP8.0设计的表单表格数据源为SQL数据库远程视图,在该表单中设计了“修改”、“确认修改”、“放弃修改”命令按钮,按“修改”命令,则将表格的readonly属性设置为.F. ;按确认“修改”命令,则使用requery("远程视图名")函数刷新远程视图而保存所修改的数据;但当发现修改错了而要恢复修改前的数据,则应如何设置“放弃修改”命令而使表单表格显示修改前的数据?
  另:如果表单表格的数据源为本地dbf表,应如何设置“放弃修改”命令而使表单表格显示修改前的数据?
  敬向电脑高手请教,应如何编程,不胜感激!


------解决方案--------------------------------------------------------
如果提交了,就不能还原。

一般这样:

设置缓冲,
修改
提交修改或放弃修改。

一旦提交修改了,就不能还原了。

你重点看一下这个
VFP 客户/服务器应用程序中的事务处理

*---------------------------------------------------

作者: Hector J. Correa

译者:RMH

--本文出自《天堂论坛》,若欲转载,敬请注明

我们都知道事务处理在数据库世界中是多么重要. 我们也知道 VFP 提供了杰出的事务处理支持. 但是, 当你的 VFP 应用程序使用另一种象 SQL Server 这样的 DBMS 来保存信息时会发生什么情况呢? 你是否还需要事务处理? 是的, 你需要. 你需要 VFP 的事务处理还是 SQL Server 的事务处理? 两者你都需要! Hector Correa 向你展示了为什么.

一般而言, 事务处理是访问数据库的一个程序单元. 在执行时, 事务处理可以接收并可能更新数据. 一个象 VFP 这样的数据库管理系统, 有执行事务处理的责任, 这样它才是原子的(OOP 术语:组合对象中的最小单元)和正确的. 要是原子的, 事务处理必须要么完成要么不执行.

使用事务处理允许你转换你从一个一致的状态转换你的数据库到另一个一致的状态. 如果一个数据库能够确保它的完整性约束则它是处于一致的状态. 在事务处理时, 数据库可能会处于不一致的状态. 但是, 如果完整性约束在事务处理结束时不能满足要求, VFP 必须终止事务处理并使数据库回到没有进行事务处理时的状态.

事务处理的典型示例包括银行传输 (从支票取走 $500, 减少 $500 存款) 和发票系统 (添加五个行项到一张发票, 从库存中移去五个项).

使用事务处理的优势是不可数的, 但基本的概念事务处理使你的生活更轻松, 因为你现在有一个个有力的, VFP 内置的机制来帮助你的数据库处于一种一致的状态.

现在, 让我们谈谈关于现实世界应用程序中的典型情节. 当你的 VFP 应用程序使用另一种象 SQL Server 这样的数据库管理系统来保存它的数据时会发生什么事? SQL Server 也支持事务处理. 你需要 SQL Server 的事务处理吗? 回答是需要. 你可以用 SQL Server 的事务处理来代替 VFP 的事务处理吗? 不, 两个你都需要. 让我们来看看为什么.

测试情节
在本文中, 我将用 VFP 的远程视图来访问并更新一个 SQL Server 数据库. 出于简单的原故, 我使用两个虚构的的 VFP 远程视图 (rv_MyView 和 rv_MyOtherView) 来访问两个 SQL Server 中的虚构的表 (MyTable 和 MyOtherTable). 图 1 显示了该情节是如何组织的.

我用 SQL Server 和 MSDE 测试了本文中的所示例. 但是, 如果你计划使用另一种 DBMS 作为你的后端, 你可能需要进行一点小小的调整.

在所附的下载文件中, 你可以找到更多的使用远程视图来访问和更新 SQL Server 7 的示例数据库 Northwind 数据库的例子.

没有事务处理的世界
在很大程度上, 事务处理是确保数据库的正确性的一种机制. 在完美的世界中, 你可能不需要事务处理. 以下代码不用事务处理来更新后端数据:

* 更新 VFP 游标中的数据.
replace balance with balance - 100 in rv_MyView
replace balance with balance + 100 in rv_MyOtherView
 
* 更新修改到 MyTable.
lEverythingOK = tableupdate( 2, .F., 'rv_MyView')
if lEverythingOK
* 更新修改到 MyOtherTable.
lEverythingOK = tableupdate( 2, .F., 'rv_MyOtherView')
endif
好了, 由于我们并不是生活在一个完美的世界上, 让我们看看如果更新 rv_MyView 成功而更新 rv_MyOtherView 失败会发生什么事.

第一个 TableUpdate() 将通知 VFP 执行一个 INSERT/UPDATE 命令到 SQL Server (例如, UPDATE myTable SET balance = 400 WHERE myTablePK = 'abc'). 一但该命令提交到后端, 后端处理它并告诉 VFP 命令成功地执行了. 第二个 TableUpdate() 失败—理由之一是后端不能处理所请求的命令--因为我正试图更新的记录被另一个用户删除了.

我将如何处理这种情况? 我已经更新了 MyTable 而且在 MyOtherTable 没有更新时不想保持这个修改. 当然, 我可以编写代码来保存 MyTable 的原始状态然后在发生错误时恢复它. 但是嗨, 这就是为什么正规的数据库管理系统中都有事务处理的能力. 让我们使用它!

事务处理命令
VFP 和 SQL Server 都提供了事务处理管理的相似的能力. 表 1 列出相等的命令.

表 1. VFP 和 SQL Server 中的事务处理命令. 

VFP 命令/函数 SQL Server 中的等价物 (T-SQL)
 
Begin Transaction | Begin Transaction
| Set Implicit_Transactions On
End Transaction | Commit
Rollback | Rollback
TnxLevel() | @@TranCount
 

虽然两个 DBMS 提供了事务处理管理的相似的能力, 但也有一些你应该注意到的精细的区别.

第一个区别是 VFP 提供了 End Transaction 命令, 而 SQL Server 提供了 Commit 命令.

另一个差异是在嵌套事务处理时的 Rollback. 在 VFP 中, Rollback 仅撤消当前事务处理中的改变 (也就是说, 对于每一个事务处理你需要一个 Rollback 命令). 然而在 SQL Server 中, Rollback 撤消所有嵌套的事务处理直到远离事务处理 (因此, 无论你有多少嵌套的事务处理, 只需要一个 Rollback 命令).

另一个不同是允许的嵌套层数. VFP 允许嵌套至五级深度, 而 SQL Server 没有嵌套深度的限制.

使用 VFP 的事务处理
在处理远程视图时, 使用 VFP 的事务处理是直接了当的. 以下代码演示了如何做:

* 更新 VFP 游标中的数据.
replace balance with balance - 100 in rv_MyView
replace balance with balance + 100 in rv_MyOtherView
* 开始 VFP 事务处理.
begin transaction
 * 更新修改到 MyTable.
 lEverythingOK = tableupdate( 2, .F., 'rv_MyView' )
 if lEverythingOK
* 更新修改到 MyOtherTable.
lEverythingOK = tableupdate( 2, .F., 'rv_MyOtherView')
  相关解决方案