Ошибка SqlDependency, так как оператор SELECT не может быть уведомлен или предоставлен - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь использовать SqlDependency, и я читаю статьи Создание запроса на уведомление , Разрешения на уведомление о запросе от Microsoft. Я дважды проверил много раз, кажется, все отвечают тому, что нужно, что упоминается в статьях. Вот мой код.

private void InitialSqlDependency()
    {
        using (var connection = new SqlConnection(_connString))
        {
            connection.Open();
            string message = string.Empty;

            string query = @"SELECT ModifiedOn FROM [dbo].[ContainerTransactions]";

            using (var command = new SqlCommand(query, connection))
            {
                command.Notification = null;

                SqlDependency dependency = new SqlDependency(command);
                dependency.OnChange += new OnChangeEventHandler(Dependency_OnChange);

                if (connection.State == ConnectionState.Closed)
                    connection.Open();

                SqlDataReader dr = command.ExecuteReader();
                if (dr.HasRows)
                {
                    dr.Read();
                    message = dr[0].ToString();
                }
            }
        }
    }

    private void Dependency_OnChange(object sender, SqlNotificationEventArgs e)
    {
        _logger.Debug("ContainerWatch Dependency Fired!");

        if (e.Type == SqlNotificationType.Change)
        {
            _logger.Debug("ContainerWatch Change Fired!");

            this.InitialSqlDependency();
        }
    }

Тем не менее, всегда не удалось подписаться. И я вижу SqlNotificationInfo возвращает Query, что означает A SELECT statement that cannot be notified or was provided. Вот моя отладка img

Оператор SELECT предельно прост. Есть ли какая-либо возможная причина, вызывающая сбой?

1 Ответ

0 голосов
/ 06 ноября 2018

Я нашел основную причину, потому что The statement must not reference tables with computed columns. Я использую запрос ниже, чтобы увидеть вычисленные столбцы

SELECT * FROM sys.computed_columns WHERE object_id = OBJECT_ID('ContainerTransactions')

Поэтому я думаю, что не могу использовать SqlDependency для этой таблицы.

...