因此,我正在开发一个应用程序,它作为一个大型专有应用程序的“伙伴”,我没有源代码,也没有修改权限。专有应用程序 将所有数据存储在Microsoft SQL数据库(我相信版本为2008 R2或更高版本)中,然而,我很清楚数据代表什么。我需要我的应用程序做的是在数据被添加,更新和删除时不断监视数据,然后自动处理数据(例如发出警报)。
问题在于找出接收其他应用程序时对数据库所做更改的最佳方法,因为我不想错过任何一个节拍。
这是到目前为止我所做的事情:
使用DataSet.Load 输入数据集:
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类上触发,需要某种主键。
必须有一些方法可以做到这一点!!!
答案 0 :(得分:2)
您考虑过SQL Server Query Notifications了吗?这使用了SQL Server Service Broker。
SqlDependency是要看的C#类。
Using SqlDependency in a Windows Application(.NET Framework 2.0示例:应该与更高版本非常相似。)
答案 1 :(得分:0)
我会考虑通过实现审计触发器或SQL Server跟踪来在SQL Server级别解决此问题。
触发器 - 想法是为要监视的所有表添加触发器。触发器将捕获所有更改并将数据存储在其他“历史”表中。设置完成后,所有应用程序需要做的就是从这些表中读取。
查看此详细信息Creating audit triggers in SQL Server
跟踪 - 您可以设置SQL Server跟踪,将所有信息存储在跟踪文件中,然后您的应用可以解析跟踪文件并查看发生了什么。
答案 2 :(得分:0)
考虑到这些条件,问题似乎没有灵丹妙药,但任何事情都比每分钟轮询数据库更好。我现在可能会做的是接受Mitch Wheat的建议并从那里开始工作:
WHERE Quantity < 0
。NumberOfPeople
值更改表Room
中的行时,另一行都会添加到其中一个表CheckIn
或CheckOut
。需要编写更多代码,但应用程序在运行时可能会做的工作少得多。