【问题标题】:SQL Server 2008 change tracking by C# clientC# 客户端的 SQL Server 2008 更改跟踪
【发布时间】:2011-02-11 15:59:31
【问题描述】:

我有 2 个应用程序,一个是与用户交互的 ASP.NET 站点,另一个是用于调度作业执行的 C# 应用程序。我在 C# 应用程序中的更改跟踪方面遇到了问题,因此它可以响应用户对数据库的更新。基本思路是这样的:

用户通过 ASP.NET 网站向 Products 数据库添加新行。然后应该通知 C# 应用程序有新的行,它会产生一个 Quartz.NET 作业来处理这个新创建的产品。如果更新了产品详细信息,则会通知 C# 应用程序并相应地更新 Quartz.NET 作业。

伪代码:

while(true) // it's not really a loop like this, but this suffices
{
    var newProducts = from p in dc.Products where Added_On > DateTime.Now;

    foreach(Product product in newProducts)
        CreateNewJob(product);
}

然后,每个作业都需要跟踪对其各个列的更改:

void Execute(...)
{
    var product = from p in dc.Products where Id == this._product.Id;

   if (CompareProduct(this._product, product) == false)
       _product = product;

   // do work with the product
}

或带有时间戳:

void Execute(...)
{
    var updated = from p in dc.Products where Id == _product.Id && Updated_On > DateTime.Now;

     if (updated != null)
         _product = updated;
}

由于产品通常不会发生变化,有没有比每次执行时都查询更改更好的解决方案?

要求是,如果数据已更改,Quartz.NET 作业不应使用陈旧数据执行。在 Execute() 的开头,它应该是最近的更改。但是,如果在执行过程中状态发生变化,那也没关系。

我查看了 SqlDependency,但我读到的所有内容都说它并没有告诉你发生了什么变化,只是告诉你发生了什么变化。大型数据库不断拉下全表,自己做对比,似乎是行不通的。

更改跟踪似乎也可能效率低下。我必须拉下所有更改,找到与更改项对应的 Quartz.NET 作业,并使用最新数据对其进行更新。

【问题讨论】:

    标签: c# sql-server quartz.net


    【解决方案1】:

    可能最好的方法是用老式的方法来做这件事——使用 sql TIMESTAMP 列自己进行更改跟踪。然后,您的调度程序只需要抓取 TIMESTAMP > [last runned TIMESTAMP] 的行来进行调度。调度时,它可以检查行以查看 TIMESTAMP 是否已更改,并在运行前抓取新数据。

    现在,如果您要担心多个表,这会变得有点复杂。

    【讨论】:

    • 是的,我怀疑这是最简单的方法。谢谢。要弄清楚发生了什么变化、锁定作业以更新它们等,通知将变得异常困难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多