SQL Server 2008通过C#客户端更改跟踪

时间:2011-02-11 15:59:31

标签: c# sql-server quartz.net

我有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作业,并使用最新数据更新它。

1 个答案:

答案 0 :(得分:1)

可能最好的方法是以旧的方式执行此操作 - 使用sql TIMESTAMP列自行执行更改跟踪。那么你的调度程序只需要获取TIMESTAMP为>的行。 [上次运行TIMESTAMP]进行安排。在安排时,它可以检查行以查看TIMESTAMP是否已更改并在运行之前获取新数据。

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