同步数据集
时间:2020-03-06 14:59:11 来源:igfitidea点击:
将DataSet与数据库中的数据同步的最佳方法是什么?以下是参数:
- 我们不能简单地重新加载数据,因为它绑定到用户可能已经配置的UI控件(这是他们可能会展开/折叠的树状网格)
- 我们不能在数据库中使用changeflag(例如UpdatedTimeStamp),因为更改并不总是在应用程序中流动(例如,DBA可以使用SQL语句更新字段)
- 我们无法在数据库中使用更新触发器,因为它是多用户系统
- 我们正在使用ADO.NET数据集
- 多个字段可以更改给定的行
我已经看过DataSet的Merge功能,但这似乎并没有保留" ID"列的概念。我已经看过DiffGram功能,但是这里的问题是那些似乎是由同一DataSet中的更改生成的,而不是某些外部数据源上发生的更改。
我已经从该解决方案运行了一段时间,但是我知道可以使用的方法(效率很低)是构建一个单独的DataSet,然后遍历所有行,逐字段对更改应用到它所在的DataSet边界。
有没有人有类似的情况?我们是如何解决该问题的?即使我们没有遇到类似的问题,也欢迎我们提出解决方案的建议。
谢谢
解决方案
我认为存储用户扩展的节点列表会比较容易(假设我们可以唯一地标识每个节点),然后重新加载数据并将其重新绑定到树视图,然后扩展所有节点以前扩展。
如果我们为每个DataTable定义了一个主键,则DataSet.Merge可以很好地实现此目的。 DataSet会将更改后的事件引发到任何数据绑定的GUI控件
如果表很小,则可以重新读取所有行并定期合并,否则限制使用时间戳读取集是一个好主意,只需告诉DBA遵守规则并更新时间戳即可;-)
另一个工作量大的选择是使用触发器或者存储过程来保留行更改队列(时间戳,行ID),并将刷新查询基于队列中的时间戳;如果基表中有很多行,这将更加有效,从而允许我们(通过队列记录上的内部联接)仅提取自上次轮询以来的更改行。