sqlite 驱动的 C# 应用程序 - 如何使用撤消日志表来实现撤消/重做?

问题描述

我有一个使用 sqlite 数据库作为模型的 c# 应用程序。撤消/重做功能部分完成;我被卡住了。

到目前为止: 当应用程序启动时,会创建一个undolog (seq INTEGER,sql TEXT),并将临时触发器添加到其他表中以将行插入到 undolog 中。 undolog 的每一行都包含执行撤消步骤所需的 sql 命令。

例如,对于表 Objects (objId INTEGER,objName TEXT),创建以下触发器。

插入后:

INSERT INTO undolog VALUES( NULL,'DELETE FROM Objects WHERE rowid='||new.rowid);

更新后:

INSERT INTO undolog VALUES( NULL,'UPDATE Objects SET objID='||quote(old.objID)||',objName='||quote(old.objName)||' WHERE rowid='||old.rowid)

删除前:

INSERT INTO undolog VALUES(NULL,'INSERT INTO Objects(rowid,objID,objName) VALUES('||old.rowid||','||quote(old.objID)||','||quote(old.objName)||')');

到目前为止一切都很好。当表被修改时,正确的行被插入到撤消日志中。如果我反向执行sql列的内容,表的修改就会被撤消。

我一直在关注精彩的 SQLite undo-redo example,但是当谈到实现撤消/重做堆栈时,我完全不明白。我完全迷路了。

我的 c# 代码中有一个漏洞,位于用户以他/她喜欢的任何顺序单击撤消和重做与 undolog 之间。这是我到目前为止所得到的:用户单击撤消,从最新的 undolog获取 sql,然后删除该行。执行sql。但是随后在 undolog 中创建了一个新行以响应撤消操作。这显然是错误的,但我不知道如何进一步。

这是一个使用 .net framework 4.7.2 的 windows 窗体应用程序。我正在使用 system.data.sqlite。在 c# 代码中构建查询并执行它们。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...