2011-07-13 11 views
3

インターネットを検索しているうちに、LINQベースのデータベースへの変更をトリガーするコードが見つかりました。それは一度だけトリガされ、何が変更/削除/追加されたのか、どのテーブルがCRUDedであったのかは分かりません。SQLテーブルの変更を購読する汎用ユーティリティ

static class GlobalNotifications 
{ 
    public static event OnChangeEventHandler OnChange; 

    public static void InitializeNotifications(string connectString) 
    { 
     // Initialize notifications 
     SqlDependency.Start(connectString); 
     // Create and register a new dependency 
     SqlDependency dependency = new SqlDependency(); 
     dependency.OnChange += new OnChangeEventHandler(NotificationCallback); 
     System.Runtime.Remoting.Messaging.CallContext.SetData("MS.SqlDependencyCookie", dependency.Id); 
    } 

    internal static void NotificationCallback(object o, SqlNotificationEventArgs args) 
    { 
     OnChange.Invoke(o, args); 
    } 
} 

これは、私はそれを使用している方法です:

public partial class Nawa : Form 
{ 
    public Nawa() 
    { 
    InitializeComponent(); 
    } 

    private void Nawa_Load(object sender, EventArgs e) 
    { 
    GlobalNotifications.InitializeNotifications("Server=GENISYSSERVER; Trusted_Connection=no;database=Maple_DBv1; user id=sa; password=Wc123Wc123"); 
    GlobalNotifications.OnChange += new System.Data.SqlClient.OnChangeEventHandler(GlobalNotifications_OnChange); 
    } 

    void GlobalNotifications_OnChange(object sender, System.Data.SqlClient.SqlNotificationEventArgs e) 
    { 
    MessageBox.Show("Test"); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
    using (DataClasses1DataContext dbcontext = new DataClasses1DataContext("Server=GENISYSSERVER; Trusted_Connection=no;database=Maple_DBv1; user id=sa; password=Wc123Wc123")) { 
     OrderFood random = dbcontext.OrderFoods.FirstOrDefault(id => id.ID == 10); 

     if (random != null) { 
     if (random.MenuID == 4) 
      random.MenuID = 1; 
     else 
      random.MenuID = 4; 

     dbcontext.SubmitChanges(); 
     } 
    } 
    } 
} 

誰かがこの点で助けることはできますか?どのように変更されたのか、変更の種類、テーブルが変更されたのか、そしてなぜそれは一度だけ起動するのかについての詳細を得る方法。また、LINQの変更のみをどのように理解できますか?それは

リファレンスなどの直接変更にトリガしません: Extemporaneous Mumblings

答えて

1

A SQLDependencyは一度だけ発生します、あなたはそれが発射した後に、依存関係を再作成する必要があります。

OnChangeイベントは1回発生してから消費されるため、イベントが発生した後に再び接続する必要があります。

Dan Miser - SqlDependency

私はこれに対処する方法を示すために手に任意のC#のコードを持っていないが、私はあなたがあなた自身の解決策を考え出すためのいくつかのVB.NETは十分に動作するはずと確信しています。

Private _permissionsDependency As SqlDependency 

Private Sub doSubscribe() 
    _permissionsDependency = New SqlDependency(cmd.InnerCommand) 
    RemoveHandler _permissionsDependency.OnChange, AddressOf User_OnChange 
    AddHandler _permissionsDependency.OnChange, AddressOf User_OnChange 
End Sub 

Private Sub User_OnChange(ByVal sender As Object, ByVal e As System.Data.SqlClient.SqlNotificationEventArgs) 
    If _permissionsDependency IsNot Nothing Then RemoveHandler _permissionsDependency .OnChange, AddressOf User_OnChange 

    Select Case e.Info 
     Case SqlNotificationInfo.Delete 
      RaiseEvent UserDeleted(Me) 
     Case SqlNotificationInfo.Update 
      populateUser() 
      RaiseEvent UserUpdated(Me) 
     Case Else 
    End Select 
End Sub 

あなたはあなたが(私の例では、私が唯一の削除および更新を探しています)何が起こったのかを知ることが可能になる、e.Infoを見て、何が起こったのかを知ることができます見ることができるように。

関連する問題