2014-09-04 81 views
4

考慮這個例子:檢測SQL數據庫改變

INSERT INTO [Table] (column1) 
SELECT value1 

如果我執行在SSMS此命令,在關於一個C#窗體應用程序,你會我需要爲了認識這個事件呢?事件發生時,應用程序顯示一個MessageBox。我似乎無法解決這個問題或找到有用的數據。我試圖使用SqlDependency但我沒有任何運氣。如果那是我需要走下去的道路,任何人都可以幫助我理解這個概念,讓它更好一點?

+0

如果我理解你,你要當你的SQL Server運行的刀片選擇在您的C#應用​​程序觸發一個事件? – paqogomez 2014-09-04 16:12:46

+0

@paqogomez正確!有點像ssms中的觸發器,我想在C#中觸發一個# – Volearix 2014-09-04 16:14:56

+1

你想檢測什麼時候從C#應用程序中的數據庫中發生變化? SQL Server不會推送通知,所以你將不得不輪詢一些東西。你可以做的一件事就是在需要的地方添加一個'INSERT TRIGGER',它從日誌記錄到審計表和'SELECT'。 – Zer0 2014-09-04 16:15:10

回答

7

如果你想檢測變化,而不是隻是插入,你可以使用SQL Dependency來實現這一點。你有沒有閱讀並嘗試鏈接中的例子?

Heres a nice 'tutorial/example' that works and runs you through the basics

Heres a nice overview of Query Notifications.

  • 低級實現是由暴露服務器側功能,使你的通知請求執行命令的SqlNotificationRequest類提供。

  • 高級實現由SqlDependency類提供,該類提供了源應用程序和SQL Server之間的通知功能的高級抽象,使您可以使用依賴關係來檢測服務器。在大多數情況下,這是通過使用SQL Server的.NET Framework數據提供程序的託管客戶端應用程序來利用SQL Server通知功能的最簡單和最有效的方法。

  • 此外,使用ASP.NET 2.0或更高版本構建的Web應用程序可以使用SqlCacheDependency輔助類。

這是因爲基本爲「A的SqlDependency對象可以用,以便在查詢結果從那些最初檢索不同,以檢測一個SqlCommand相關聯。」

必須首先Enable Query Notifications,並按照Creating a Query for Notification

void Initialization() 
{ 
    // Create a dependency connection. 
    SqlDependency.Start(connectionString, queueName); 
} 

void SomeMethod() 
{ 
    // Assume connection is an open SqlConnection. 
    // Create a new SqlCommand object which directly references (no synonyms) the data you want to check for changes. 
    using (SqlCommand command=new SqlCommand("SELECT value1 FROM [Table]", connection)) 
    { 
     // Create a dependency and associate it with the SqlCommand. 
     SqlDependency dependency=new SqlDependency(command); 
     // Maintain the refence in a class member. 

     // Subscribe to the SqlDependency event. 
     dependency.OnChange+=new OnChangeEventHandler(OnDependencyChange); 

     // Execute the command. 
     using (SqlDataReader reader = command.ExecuteReader()) 
     { 
      // Process the DataReader. 
     } 
    } 
} 

// Handler method 
void OnDependencyChange(object sender, SqlNotificationEventArgs e) 
{ 
    // Handle the event (for example, invalidate this cache entry). 
} 

void Termination() 
{ 
    // Release the dependency. 
    SqlDependency.Stop(connectionString, queueName); 
} 
+0

這不會給我插入的行 – 2018-03-02 11:32:09