Зависимость от SQL и ссылки на данные в SQL

когда мы работаем с зависимостью sql, нам всегда нужно ссылаться на sql, как показано ниже, SELECT ActivityDate FROM [bba-reman].MyLog

я просто хотел бы знать, если я напишу вышеприведенный sql таким образом, тогда он будет работать

SELECT TOP 1 ActivityDate FROM [bba-reman].MyLog OR

SELECT TOP 5 ActivityDate FROM [bba-reman].MyLog

я ищу предложения и руководства.

private void RegisterNotification()
{
    string tmpdata = "";
    System.Data.SqlClient.SqlDependency.Stop(connectionString);
    System.Data.SqlClient.SqlDependency.Start(connectionString);

    try
    {
        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            conn.Open();
            SqlCommand cmd = conn.CreateCommand();

            cmd.CommandText = "SELECT ActivityDate FROM [bba-reman].MyLog";
            dep = new SqlDependency(cmd);
            dep.OnChange += new OnChangeEventHandler(OnDataChange);

            SqlDataReader dr = cmd.ExecuteReader();
            {
                while (dr.Read())
                {
                    if (dr[0] != DBNull.Value)
                    {
                        tmpdata = dr[0].ToString();
                    }
                }
            }

            dr.Dispose();
            cmd.Dispose();
        }
    }
    finally
    {
        //SqlDependency.Stop(connStr);
    }
}

person Mou    schedule 21.04.2015    source источник
comment
Я не уверен, что полностью понимаю ваш вопрос. Вы хотите, чтобы ТОП запросы были отсортированы: ВЫБЕРИТЕ ТОП 1 ActivityDate FROM [bba-reman] ORDER BY ActivityDate DESC   -  person Alex    schedule 21.04.2015
comment
да, если я отправлю этот запрос в зависимость от sql, это сработает? может уведомить об изменении?   -  person Mou    schedule 21.04.2015
comment
Да, вы можете отправить этот запрос в SqlDependency, и он должен работать.   -  person Alex    schedule 21.04.2015


Ответы (2)


Класс SqlDependency имеет множество ограничений. а также проблемы с утечкой памяти. Одним из них является отсутствие инструкции TOP. Однако вы можете использовать реализацию класса SqlDependency с открытым исходным кодом — SqlDependencyEx. Он использует триггер базы данных и собственное уведомление Service Broker для получения событий об изменениях таблицы. Это пример использования:

int changesReceived = 0;
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
          TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) 
{
    sqlDependency.TableChanged += (o, e) => changesReceived++;
    sqlDependency.Start();

    // Make table changes.
    MakeTableInsertDeleteChanges(changesCount);

    // Wait a little bit to receive all changes.
    Thread.Sleep(1000);
}

Assert.AreEqual(changesCount, changesReceived);

С помощью SqlDependecyEx вы можете отслеживать INSERT, DELETE, UPDATE отдельно и получать фактически измененные данные (xml) в объекте аргументов события. Фильтрация входящих сообщений помогает реализовать желаемое поведение. Надеюсь, это поможет.

person dyatchenko    schedule 22.04.2015

Согласно электронной документации по SQL Server (https://msdn.microsoft.com/en-us/library/t9x04ed2.aspx), одно из ограничений на использование QueryNotifications заключается в том, что оператор не должен использовать выражение TOP. SqlDependency — это просто реализация более высокого уровня QueryNotifications, которая заботится о подключении Service Broker.

person Dan Guzman    schedule 22.04.2015