2011-02-11 121 views
0

變化跟蹤我有兩個應用,一個一個ASP.NET網站與用戶界面,再進行第二次C#應用程序以供執行的調度作業。我在C#應用程序中更改跟蹤時遇到問題,因此它可以響應用戶對數據庫的更新。其基本思路是這樣的:SQL Server 2008中的C#客戶

用戶通過ASP.NET網站添加一個新行到產品數據庫。然後應該通知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

也許最好的辦法是做這樣的老fashoined方式 - 使用SQL時間戳列做更改跟蹤自己。然後,您的調度程序只需要抓取TIMESTAMP> [[上次運行的TIMESTAMP]要調度的行)。計劃時,它可以檢查行以查看TIMESTAMP是否已更改,並在運行之前獲取新數據。

現在,如果你有多個表擔心,這變得更復雜一點。

+0

是的,我懷疑這是最簡單的方法。謝謝。如果想知道更改了什麼,鎖定工作以更新它們等,通知會非常困難。 – mfanto 2011-02-14 04:25:59