所以我正在开发一个应用程序,它可以作为大型专有应用程序的“伙伴”,我没有源代码,也没有修改权限。然而,专有应用程序确实将其所有数据存储在 Microsoft SQL 数据库(我相信是 2008 R2 或更高版本)中,而且我很清楚这些数据代表什么。我需要我的应用程序做的是在添加、更新和删除数据时不断监控数据,然后自动对数据采取行动(例如发出警报)。
问题是找出接收其他应用程序对数据库所做更改的最佳方法,因为我不想错过任何一个节拍。
这是我到目前为止所做的:
- LINQ to SQL:据我所知,每次运行查询时,我都会收到一组新数据,但我无法仅接收更改或收到更改通知。
使用 DataSet.Load 键入 DataSet:
using (IDataReader reader = dataSetInstance.CreateDataReader()) { dataSetInstance.Load(reader, LoadOption.OverwriteChanges, dataSetInstance.Table1, dataSetInstance.Table2, dataSetInstance.Table3); }
当我这样做时,这并没有很好地发挥作用。调用该方法
dataSetInstance
后仅包含一组未填充的表。Load
我希望在第一次致电dataSetInstance.GetChanges
后dataSetInstance.AcceptChanges
定期致电dataSetInstance.Load
以获取更改。我做错了吗?类型化的 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
方法(根据文档)。- 按日期/时间字段检索行:这是我开始做的事情,但在观察其他应用程序在创建行后修改行中的字段后我停止了。考虑一下:有一行带有事务的时间戳和一个布尔字段,用于指定事务是否稍后被取消。如果它被取消,其他应用程序只需返回该行并切换值。时间戳保持不变,我的应用程序永远不会知道这个消息。没有诉讼时效;其他应用程序可以在将来随时更改此字段。
顺便提一下,这个其他应用程序没有在数据库中实现任何约束,例如外键和主键。我相信我在文档中的某处读到,对于行更新事件等要在类型化的 DataTable 类上触发,需要某种主键。
一定有办法做到这一点!!!