【问题标题】:Synchronize DataSet同步数据集
【发布时间】:2010-09-14 14:09:15
【问题描述】:

将 DataSet 与数据库中的数据同步的最佳方法是什么?以下是参数:

  • 我们不能简单地重新加载数据,因为它绑定到用户可能已配置的 UI 控件(这是一个用户可以展开/折叠的树形网格)
  • 我们不能在数据库中使用更改标志(如 UpdatedTimeStamp),因为更改并不总是通过应用程序进行(例如,DBA 可以使用 SQL 语句更新字段)
  • 我们不能在数据库中使用更新触发器,因为它是一个多用户系统
  • 我们正在使用 ADO.NET 数据集
  • 给定行的多个字段可以更改

我查看了 DataSet 的合并功能,但这似乎没有保留“ID”列的概念。我查看了 DiffGram 功能,但这里的问题是这些似乎是由同一 DataSet 中的更改生成的,而不是在某些外部数据源上发生的更改。

我已经从这个解决方案运行了一段时间,但我知道可行的方法(效率低下)是构建一个单独的 DataSet,然后迭代所有行,逐个字段地应用更改到 DataSet 上它是绑定的。

有人遇到过类似的情况吗?你做了什么来解决这个问题?即使您没有遇到类似的问题,我们也欢迎您提出任何解决方案建议。

谢谢

【问题讨论】:

    标签: sql-server ado.net dataset


    【解决方案1】:

    DataSet.Merge 非常适合这种情况如果您为每个 DataTable 定义了一个主键; DataSet 将向任何数据绑定的 GUI 控件引发更改的事件

    如果您的表很小,您可以重新读取所有行并定期合并,否则限制使用时间戳读取的集合是个好主意 - 只需告诉 DBA 遵循规则并更新时间戳即可; -)

    另一个选项 - 有点工作 - 是使用触发器或存储过程保留更改的行队列(时间戳,行 ID),并将刷新查询基于队列中的时间戳;如果基表中有很多行,这将更有效,允许您(通过队列记录上的内部连接)仅提取自上次轮询时间以来更改的行。

    【讨论】:

      【解决方案2】:

      我认为存储用户已展开的节点列表会更容易(假设您可以唯一标识每个节点),然后重新加载数据并将其重新绑定到树视图,然后展开之前展开的所有节点。

      【讨论】:

        猜你喜欢
        • 2014-05-21
        • 2011-09-10
        • 1970-01-01
        • 2022-11-02
        • 2018-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-11
        相关资源
        最近更新 更多