如何填充类型化数据集,保持同步并在数据更改时接收更新?

时间:2013-06-30 07:24:53

标签: c# .net sql-server synchronization dataset

因此,我正在开发一个应用程序,它作为一个大型专有应用程序的“伙伴”,我没有源代码,也没有修改权限。专有应用程序 将所有数据存储在Microsoft SQL数据库(我相信版本为2008 R2或更高版本)中,然而,我很清楚数据代表什么。我需要我的应用程序做的是在数据被添加,更新和删除时不断监视数据,然后自动处理数据(例如发出警报)。

问题在于找出接收其他应用程序时对数据库所做更改的最佳方法,因为我不想错过任何一个节拍

这是到目前为止我所做的事情

  1. LINQ to SQL :据我所知,每次运行查询时,都会收到一组新数据,但我无法接收更改或收到通知变化。
  2. 使用DataSet.Load 输入数据集:

    using (IDataReader reader = dataSetInstance.CreateDataReader())
    {
        dataSetInstance.Load(reader, LoadOption.OverwriteChanges, dataSetInstance.Table1, dataSetInstance.Table2, dataSetInstance.Table3);
    }
    

    当我这样做时,这并没有太好用。调用dataSetInstance方法后,Load仅包含一组未填充的表。我希望在第一次调用dataSetInstance.GetChanges后定期拨打dataSetInstance.AcceptChangesdataSetInstance.Load来获取更改。我做错了吗?

  3. 使用关联的表适配器单独填充表的类型化DataSet

    using (Table1TableAdapter adapter = new Table1TableAdapter())
    {
        adapter.Fill(dataSetInstance.Table1);
    }
    
    using (Table2TableAdapter adapter = new Table2TableAdapter())
    {
        adapter.Fill(dataSetInstance.Table2);
    }
    
    using (Table3TableAdapter adapter = new Table3TableAdapter())
    {
        adapter.Fill(dataSetInstance.Table3);
    }
    

    当然,问题是实际上有超过3个表可以加起来相当多的重复代码(和维护工作),但真正的问题是我不会收到任何更改通知,因为我我没有使用Load / AcceptChanges方法(根据文档)。

  4. 按日期/时间字段检索行:这是我开始处理的内容,但是在观察其他应用程序后,我停止了在创建它们之后修改行中的字段。考虑一下:     有一行包含事务的时间戳和一个布尔字段,用于指定事务是否稍后被取消。如果取消,则另一个应用程序只返回该行并切换值。时间戳保持不变,我的申请永远不会知道新闻。没有诉讼时效;另一个应用程序可以在将来的任何时候更改此字段。
  5. 顺便说一句,我应该提到这个其他应用程序没有在数据库中实现任何约束,例如外键和主键。我相信我在文档中的某处读到了对于行更新事件,例如在类型化的DataTable类上触发,需要某种主键。

    必须有一些方法可以做到这一点!!!

3 个答案:

答案 0 :(得分:2)

您考虑过SQL Server Query Notifications了吗?这使用了SQL Server Service Broker。

SqlDependency是要看的C#类。

答案 1 :(得分:0)

我会考虑通过实现审计触发器或SQL Server跟踪来在SQL Server级别解决此问题。

触发器 - 想法是为要监视的所有表添加触发器。触发器将捕获所有更改并将数据存储在其他“历史”表中。设置完成后,所有应用程序需要做的就是从这些表中读取。

查看此详细信息Creating audit triggers in SQL Server

跟踪 - 您可以设置SQL Server跟踪,将所有信息存储在跟踪文件中,然后您的应用可以解析跟踪文件并查看发生了什么。

答案 2 :(得分:0)

考虑到这些条件,问题似乎没有灵丹妙药,但任何事情都比每分钟轮询数据库更好。我现在可能会做的是接受Mitch Wheat的建议并从那里开始工作:

  • 有些表的行很可能会发生变化。例如,最近的购买比7天前或6个月前的购买更有可能被取消,或者在1年的情况下 - 可能永远不会被取消。应用程序只需要监视限制在特定时间范围内的查询。较旧(在创建时间方面)行将以较慢的速率刷新,并且不会从SQL Server查询通知中提示。应用程序将不得不容忍一些陈旧的数据,以便不必每分钟从数据库中不必要地拉出整个表。
  • 对于没有按时间顺序排列的信息的表格,应用程序必须接收有关重要条件或必须立即采取行动的查询的通知,例如WHERE Quantity < 0
  • 其他表格需要采取一些更聪明的方法。某些表永远不会更新,也不会删除它们的行,但只要其他表的行发生更改,它们就会获得新行。例如:每次NumberOfPeople值更改表Room中的行时,另一行都会添加到其中一个表CheckInCheckOut

需要编写更多代码,但应用程序在运行时可能会做的工作少得多。