2015-04-21 1 views
1

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

я просто хотел бы знать, если я пишу выше SQL таким образом, то это работает

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

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); 
    } 
} 
+2

Я не уверен, что полностью понимаю ваш вопрос. Вы хотите, чтобы запросы TOP были отсортированы: SELECT TOP 1 ActivityDate FROM [bba-reman] ORDER BY ActivityDate DESC – Jaco

+0

yes, если я отправляю этот запрос на sql-зависимость, тогда он работает? может уведомить об изменении? – Mou

+0

Да, вы можете отправить этот запрос в SqlDependency, и он должен работать. – Jaco

ответ

0

Класс SqlDependency имеет множество ограничений, а также утечку памяти problems. Отсутствие инструкции TOP является одним из них. Hovewer, вы можете использовать реализацию с открытым исходным кодом класса 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) в случае объектно арг. Фильтрация входящих сообщений помогает реализовать желаемое поведение. Надеюсь, эта помощь.

1

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