none
SqlDependency, Service Broker что на что изменилось, как отследить RRS feed

  • Общие обсуждения

  • Правильно ли я понимаю что Service Broker передает только какая выполнилась команда и не передает где и что изменилось? Мне необходимо выполнять некую функцию только в случае если значение определенного поля изменилось с 0 на 1. Я начал костылять реализовывая подключения к БД внутри метода обработчика события и перед тем как выполнить команду проверял что же у меня там сейчас, но это будет работать в случае если мы знаем какая именно строка(id) и какой столбец в БД изменяется. Вопрос, как получить информацию где и что на что изменилось? То есть если в моем запросе несколько столбцов, которые я отслеживаю, было бы не плохо получить во время изменения : имя столбца где прошло изменение, предыдущее значение, на что поменялось и например(id) записи. Вот например триггер на столбце в БД :

    BEGIN
        if (UPDATE(id_shiftStatus))
        BEGIN
            DECLARE @statusBefore int = (SELECT TOP 1 id_shiftStatus FROM DELETED)
            DECLARE @statusAfter int = (SELECT TOP 1 id_shiftStatus FROM INSERTED)
            DECLARE @id int = (SELECT TOP 1 id FROM INSERTED)
       END
    END  

    Вот так я понимаю что на что изменилось и знаю id записи где это случилось, касательно столбца как бы он зараниее известен. Но как поступить с Service Broker?

    Реализация SubscriptionsWatcher

    class SubscriptionsWatcher
    {
        private const string connectionString = "";
        private Dashboard dashboard;
        private int variableValue;

        public SubscriptionsWatcher(Dashboard dashboard)
        {
            this.dashboard = dashboard;
        }

        public void StartWatching()
        {
            SqlDependency.Stop(connectionString);
            SqlDependency.Start(connectionString);
            ExecuteWatchingQuery();
        }

        private void ExecuteWatchingQuery()
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                using (SqlCommand command = new SqlCommand("select intTest from dbo.test", connection))
                {
                    SqlDependency sqlDependency = new SqlDependency(command);                    
                    sqlDependency.OnChange += new OnChangeEventHandler(OnDatabaseChange);

                    using (SqlDataReader reader = command.ExecuteReader())
                    {

                    }
                }
            }
        }

        private void OnDatabaseChange(object sender, SqlNotificationEventArgs args)
        {
            SqlNotificationInfo info = args.Info;
            if (SqlNotificationInfo.Update.Equals(info))
            {
                MessageBox.Show("Its work");
            }

            ExecuteWatchingQuery();
        }
    }

    24 ноября 2017 г. 12:39