2013-05-12 42 views
0

好吧,我不是很熟悉數據庫,所以可能有一個簡單的解決方案,我不知道。主題,事件和數據庫

我有一個SQL數據庫是由我的c#應用程序中的類來管理。我想讓班級做的是不斷地檢查數據庫,看看是否有新的數據。如果有新數據,我希望它觸發另一個班級正在收聽的事件。現在我猜測我需要實現一個線程,該線程將檢查每隔一個毫秒或其他東西的數據庫。但是,爲了解僱我的活動,我需要尋找什麼?有新的條目時,數據庫能否通知該類?

+0

您可以使用計時器來做到這一點。 – svick 2013-05-12 16:12:32

+0

什麼類型的數據庫? – RBarryYoung 2013-05-12 16:38:01

回答

0

如果您使用MS SQLServer,則可以使用.NET Framework中的SqlDependency類來獲取有關數據庫更改的通知。

也許其他數據庫系統在其數據庫驅動程序包中具有類似的機制。

如果因爲任何原因無法使用它,您將需要一個線程來定期輪詢數據庫。

0

除了使用SqlDependency以外,如果使用ASP.NET或MVC和Cache對象,則可以使用TimerSqlCacheDependency。不推薦使用1ms間隔,因爲在下一次啓動前您可能不會完成檢查,因此數據庫負載將非常高。你也可以確保你使用Timer.AutoReset屬性,所以你沒有呼叫彼此跳閘。

編輯2:This MSDN example顯示瞭如何使用SqlDependency,包括必須Enable Query Notifications (MSDN)。使用SqlDependency時需要考慮很多因素,例如,它的設計確實是爲有限觀察者創建的Web服務器設計的,而不是桌面應用程序,所以請記住這一點。有關於這個叫Planning for Notifications在BOL一個很好的文章,強調的是查詢通知有用

如果查詢中的數據發生變化相對較少,如果應用程序不需要即時更新數據改變時,如果查詢符合在通知

創建查詢在您的樣品概括爲你建議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毫秒的延遲。如果你這樣做,完全不同的方法可能會更好。例如,您可能需要使用數據編寫器的通知機制到您的應用程序的需要知道更新發生的部分現在

0

1.如果您希望數據庫通知您的應用程序有關更改,則可以使用Broker(首先啓用數據庫以支持Brokers,然後編寫一些代碼以「附加」Broker)。對於您的應用程序,您將需要SqlDependency Class。

幫助鏈接: Enable Broker

Query Notifications in SQL Server

如果要檢查多個查詢然後注意,經紀人是一個小haevy。

2.如果您希望自己的應用程序完成所有工作,您必須創建一個函數來檢查選定表格的CKECKSUM,每次保留最後一個校驗和時,如果發現任何不同,那麼您將「點擊「數據庫以獲取新數據。

您必須決定誰將完成所有工作! 希望它有幫助。