数据库中的一些数据更改。如何触发一些C#代码在这些更改上做一些工作?

时间:2009-02-04 23:57:15

标签: c# database ado.net odp.net

假设我有一个带有数据库的应用程序A.现在我想添加另一个应用程序B,它应该跟踪应用程序A的数据库更改。应用程序B应该在数据发生变化时进行一些计算。两个应用程序之间没有直接通信。两者都只能看到数据库。

基本问题是:数据库中的某些数据发生了变化。如何触发一些C#代码在这些更改上做一些工作?


为了给出答案的一些刺激,我提到了一些我正在考虑的方法:

  1. 进行应用程序B轮询 感兴趣的表格的变化。 优点:简单的方法。 缺点:交通量很大, 特别是当很多桌子的时候 参与。
  2. 介绍将触发的触发器 在某些事件上。当他们开火 他们应该写一些条目 “事件表”。仅限申请B. 需要轮询“事件表”。 优势:减少流量。 缺点:逻辑被放入 触发器形式的数据库。 (这不是问题 触发器的“邪恶”。这是一个设计 问题,这使它成为一个 缺点。)
  3. 摆脱投票方式和 使用SqlDependency类来获取 通知变更。优点: (也许?)流量少于民意 做法。缺点:不是数据库 独立。 (我知道 ODP.NET中的OracleDependency,但是什么 关于其他数据库?)
  4. 哪种方法更有利?也许我已经错过了上述方法中的一些主要(dis)优势?也许还有其他一些我没想过的方法?


    编辑1:数据库独立性是......让我们称呼它们的一个因素......“销售人员”。我可以使用SqlDependency或OracleDependency。对于DB2或其他数据库,我可以回退到轮询方法。这只是成本和收益的问题,我想至少考虑一下,以便我可以讨论它。

6 个答案:

答案 0 :(得分:1)

我会选择解决方案#1(轮询),因为避免独立应用之间的依赖关系和直接连接有助于降低复杂性和问题。

答案 1 :(得分:1)

我认为你已经涵盖了我所考虑的方法,没有绝对的“最佳”方法,重要的是你的要求和优先事项。

我个人喜欢SqlDependency类的优雅;对于大多数应用程序而言,数据库独立性在现实世界中至关重要?但是,如果您拥有数据库独立性是一个优先事项,那么您就无法使用它。

轮询是我的第二个最爱,因为它使数据库保持清除触发器和应用程序逻辑;无论如何,这真的不是一个糟糕的选择,因为你说它很简单。如果应用程序B可以在“注意到”数据库更改之前一次等待几分钟,那么这将是一个不错的选择。

所以我的答案是:这取决于。 :)

祝你好运!

答案 2 :(得分:1)

我会选择#1。实际上并不像你想象的那么多。如果您的数据没有经常更改,您可能会对此感到悲观,只能获取一些可以让您了解表格更改的内容。

如果您设计的图表中考虑了民意调查,那么每次民意调查可能不会产生那么大的影响。

  • 如果您只是添加记录而不是更改记录,那么在特定的表格中检查最高ID就足够了。

  • 如果您要更新它们,则可以存储时间戳列并将其编入索引,然后查找最大时间戳。

  • 您可以发送一个ubber查询,轮询多个talbes(有效)并返回已更改的表列表。

这个答案中没有任何内容特别聪明,我只是想表明#1可能不像最初看起来那么糟糕。

答案 3 :(得分:0)

  1. 您真的关心数据库独立性吗?
  2. 为每个具有相同公共接口的数据库类型创建差异机制真的很难吗?
  3.   

    我知道ODP.NET中的OracleDependency,但其他数据库呢?

    SQL Server有类似的东西,但我从未使用它。

答案 4 :(得分:0)

您可以创建一个MySqlDependency类,并实现SqlDependency或SqlDependencyForOracle(pooling)

答案 5 :(得分:0)

您可以在SQL CLR Database Project中使用SQL触发器并在该项目中运行代码,请参阅:https://msdn.microsoft.com/en-us/library/938d9dz2.aspx

或者,在SQL CLR Database Project内的触发器上,您可以从SQL CLR Database Project向项目提出您实际想要对触发器执行操作的请求。