3

インターネットをしばらく検索した後、データベースへのLINQベースの変更をトリガーするこのコードを見つけました。一度だけトリガーされ、何が変更/削除/追加されたか、またはどのテーブルがCRUDされたかについては言及も表示もされません。

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();
      }
    }
  }
}

誰かがこの点で助けることができますか?変更内容、変更の種類、変更されたテーブルの詳細を取得する方法、および1回だけ起動する理由。また、LINQの変更のみをどのように理解できますか?直接の変更などではトリガーされません。

参照: 即席のつぶやき

4

1 に答える 1

1

SQLDependencyは1回だけ起動します。起動後に、依存関係を再作成する必要があります。

OnChangeイベントは一度発生してから消費されるため、発生後にイベントを再度フックする必要があります。

ダン・マイザー-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のかを知ることができます。これにより、何が起こったのかを知ることができます(私の例では、削除と更新のみを探しています)。

于 2011-08-08T15:48:08.403 に答える