Универсальная утилита для подписки на изменения таблицы SQL - PullRequest
3 голосов
/ 13 июля 2011

Через некоторое время поиска в интернете я обнаружил этот фрагмент кода, который запускается при изменении базы данных на основе LINQ.Он запускается только один раз и не упоминает и не показывает, что было изменено / удалено / добавлено или какая таблица была CRUDed.

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?Он не срабатывает при прямых изменениях и т. Д.

Ссылка: Бессмысленные бормотания

1 Ответ

1 голос
/ 08 августа 2011

SQLDependency сработает только один раз, вам нужно воссоздать зависимость после ее срабатывания.

Событие 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, который позволит вамзнаю, что произошло (в моем примере я ищу только удаления и обновления).

...