明经CAD社区

 找回密码
 注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 2732|回复: 3

请教:vba中通过DAO对数据库实现“后退”功能

[复制链接]
发表于 2004-11-23 22:17 | 显示全部楼层 |阅读模式
我在程序中用DAO建立一个mdb数据库,用来保存dwg文件中的一些附属信息,比如:我选择一些线条,然后在弹出窗口中输入这些线条的所代表的零件的规格,再将我输入的这些信息连同已选择的线条的长度、位置等信息通过DAO写入数据库。


现在我同事使用后提出一点建议,希望增加一个后退功能,以便在数据写入后可以后悔,撤销上一次甚至是若干次的输入。我尝试用一个笨办法,即在每次往数据库写入前先对数据库进行备份,这样的话我备份多少次我就可以后退多少次。但我不想对整个mdb文件进行备份,因为如果数据库大的话这样实在太慢。我只想对写入数据的那个表进行备份,请问用DAO实现数据库“后退”这个功能有没有什么比较快捷的方法?

 楼主| 发表于 2004-11-29 23:23 | 显示全部楼层
呵呵,这么多天了都没有高手愿意指教吗?
发表于 2005-3-14 11:06 | 显示全部楼层
你的思路基本上是正确的,当然不需要对整个数据库进行备份,实际上,你可以在数据库中增加两个表,一个表来记录用户对数据库所作的修改,另一个表记录用户的“后退”操作(主要用于将来的“前进”操作)。当用户执行“后退”操作时,就从这些表中提取数据。至于这两个表的结构,你可以参考下面给出的第二套方案。


第二套方案是将用户操作保存在内存中,由于内存不能直接保存数据库表结构,需要设置一个自定义的数据类型:(以下用的是VB语句,当然用C++应该更容易实现)


Const MaxFields As Integer = 10 //假设用户一次最多修改10个数据字段


Type UserUpd                 //用于保存用户所作修改操作


         TblName As String //用户修改的数据表名称


         FieldName(MaxFields) As String //用户修改的字段名称


         FieldValue(MaxFields) As Variant //用户修改前字段值


End Type


然后在工程中声明以下全局变量:


Const MaxUndo As Integer = 30         //假设最多保存30步用户操作


Public SavUndo(MaxUndo) As UserUpd                         //如果你使用的是C++语言,最好将这个变量声明为链表结构,这样程序更为灵活


这样,在用户修改数据库的相应事件代码中,你可以填写SavUndo数组,在用户执行“后退”操作的事件代码中根据SavUndo数组内容重新修改数据库。


当然,还有些细节需要考虑。比如用户执行“后退”操作所引起的数据库改动与用户修改数据库所引起的改动需要区别; “后退”操作引起的数据库改动应该如何处理等等。这些请楼主先自己做做,有问题再发贴。
发表于 2017-9-26 14:02 | 显示全部楼层
真的不错的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号  
©2000-2017 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2018-2-21 11:07 , Processed in 0.204741 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表