0

好的,所以我对数据库不是很熟悉,所以可能有一个我不知道的简单解决方案。

我有一个 SQL 数据库,由我的 c# 应用程序中的一个类管理。我想让班级做的是不断检查数据库以查看是否有新数据。如果有新数据,我希望它触发另一个类将要监听的事件。现在我猜我需要实现一个线程,每隔一毫秒或其他时间检查一次数据库。但是,为了触发我的活动,我需要寻找什么?当有新条目时,数据库可以通知班级吗?

4

3 回答 3

0

如果您使用的是 MS SQLServer,则可以使用 .NET Framework 中的SqlDependency类来获取有关数据库更改的通知。

也许其他数据库系统在其数据库驱动程序包中具有类似的机制。

如果由于某种原因您不能使用它,您将需要一个线程来定期轮询数据库。

于 2013-05-12T16:14:35.917 回答
0

除了使用SqlDependency之外,您还可以使用Timer,或者SqlCacheDependency如果您将 ASP.NET 或 MVC 与Cache对象一起使用。不建议使用 1 毫秒的间隔,因为您可能不会在下一次开始之前完成检查,因此您的数据库负载将非常高。您还可以确保您使用该Timer.AutoReset物业,这样您就不会被电话绊倒。

编辑 2:这个 MSDN 示例展示了如何使用SqlDependency,包括必须启用 Query Notifications (MSDN)。使用 有很多注意事项SqlDependency,例如,它实际上是为创建有限观察者的 Web 服务器设计的,而不是桌面应用程序,所以请记住这一点。有一篇关于 BOL 的好文章称为Planning for Notifications,它强调查询通知很有用

如果查询中的数据相对不频繁地更改,如果应用程序在数据更改时不需要即时更新,并且查询是否满足为通知创建查询中概述的要求和限制

在您的示例中,您建议需要 1 毫秒的延迟,因此依赖类可能不是您的最佳方式(另请参阅我稍后对您的延迟要求的评论)。

编辑:例如(使用计时器):

class Program
{
    static void Main(string[] args)
    {
        Timer timer = new Timer(1);
        timer.Elapsed += timer_Elapsed;
        timer.AutoReset = false;
        timer.Enabled = true;
    }

    static void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        Timer timer = (Timer)sender;
        try
        {
            //  do the checks here
        }
        finally
        {
            //  re=enable the timer to check again very soon
            timer.Enabled = true;
        }
    }
}

至于要检查什么,这取决于您实际想要检测的变化。这里有一些想法:

  • 表行数(但如果自上次检查后添加和删除行,则很危险)
  • 表 id 列的最大值(仅当您有一个正在增加的数字标识字段时才有效,并且仅适用于检查新行)
  • 检查各个列以查看您要查看的特定行中的更改
  • 使用列CHECKSUM中的一行来检查各个行的更改
  • 要求作者使用可以检查的更改参考 ID 更新单独的表
  • 使用审计表记录更改,并检查新的审计记录

您需要更好地定义变更监控的范围,然后才能得到一个好的答案。

潜伏

还要问自己是否真的需要 1 毫秒的更改更新延迟。如果你这样做,完全不同的方法可能会更好。例如,您可能需要使用数据编写者的通知机制来通知您的应用程序中需要知道现在发生了更新的部分。

于 2013-05-12T16:17:46.833 回答
0

1.如果您希望数据库通知您的应用程序有关更改,那么您可以使用代理(首先您启用您的数据库以支持代理,然后您编写一些代码以“附加”代理。)。对于您的应用程序,您将需要 SqlDependency 类。

有用的链接: 启用代理

SQL Server 中的查询通知

如果您想检查多个查询,请注意 Broker 有点繁琐。

2.如果您希望您的应用程序完成所有工作,您必须创建一个函数来检查所选表的 CKECKSUM,每次您将保留最后一个校验和,如果您发现任何差异,那么您将“命中”数据库获取新数据。

你必须决定谁来做你所有的工作!希望能帮助到你。

于 2013-05-12T16:20:14.453 回答