huidi 发表于 2004-11-23 22:17:00

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

我在程序中用DAO建立一个mdb数据库,用来保存dwg文件中的一些附属信息,比如:我选择一些线条,然后在弹出窗口中输入这些线条的所代表的零件的规格,再将我输入的这些信息连同已选择的线条的长度、位置等信息通过DAO写入数据库。


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

huidi 发表于 2004-11-29 23:23:00

呵呵,这么多天了都没有高手愿意指教吗?

leeyeafu 发表于 2005-3-14 11:06:00

你的思路基本上是正确的,当然不需要对整个数据库进行备份,实际上,你可以在数据库中增加两个表,一个表来记录用户对数据库所作的修改,另一个表记录用户的“后退”操作(主要用于将来的“前进”操作)。当用户执行“后退”操作时,就从这些表中提取数据。至于这两个表的结构,你可以参考下面给出的第二套方案。


第二套方案是将用户操作保存在内存中,由于内存不能直接保存数据库表结构,需要设置一个自定义的数据类型:(以下用的是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数组内容重新修改数据库。


当然,还有些细节需要考虑。比如用户执行“后退”操作所引起的数据库改动与用户修改数据库所引起的改动需要区别; “后退”操作引起的数据库改动应该如何处理等等。这些请楼主先自己做做,有问题再发贴。

LIULISHENG 发表于 2017-9-26 14:02:26

真的不错的
页: [1]
查看完整版本: 请教:vba中通过DAO对数据库实现“后退”功能