2012-01-26 2 views
1

Я попытался настроить SQL-зависимость для запуска запроса «Count Rows» (написанного на C#, SQL Server 2008 Express), но после того, как идет исходная подписка SQLNotificationType, обработчик событий никогда не кажется хотите снова запустить (несмотря на добавление строк, и я проверил SQL, и он возвращает ожидаемое значение ...).SQL Dependency not Firing

Мой код ниже. Любые мысли очень ценятся!

EDIT: Проект, в котором находится этот код, представляет собой программу WPF. У меня есть этот код, который хранится в отдельном классе, который моя программа WPF создает экземпляр в обработчике событий «Initialized». Затем у меня есть метод в этом классе, который сначала вызывает ConnectToDatabase(), а затем вызывает SetupSQLDependency().

EDIT 2: Как примечание, эта программа представляет собой WPF, который я надеялся распространять среди нескольких пользователей. Цель состояла в том, чтобы обновить WPF с определенной информацией, когда новые строки были добавлены в базу данных. Я думал, что это будет лучший способ сделать это, а не всегда запрашивать базу данных.

 private void ConnectToDatabase() 
     { 
     //This method is the first to be called, and is the entry 
     // point into my SQL database code. 

      databaseConnection = new SqlConnection(connectionString); 

      // Setup command used in SqlDependecy 
      SqlCommand tempCmd = new SqlCommand(); 
      tempCmd.Connection = databaseConnection; 
      tempCmd.CommandText = "SELECT COUNT(ID) FROM [Example].[dbo].[ExampleTable]"; 
      sqlCmd = tempCmd; 

      try 
      { databaseConnection.Open(); } 
      catch (Exception e) 
      { writeDebug(e.ToString()); } 
     }   

     private void SetupSQLDependency() 
     { 
      SqlDependency.Stop(connectionString); 
      SqlDependency.Start(connectionString); 

      sqlCmd.Notification = null; 

      // create new dependency for SqlCommand 
      SqlDependency sqlDep = new SqlDependency(sqlCmd); 
      sqlDep.OnChange += new OnChangeEventHandler(sqlDep_OnChange); 

      SqlDataReader reader = sqlCmd.ExecuteReader(); 
     } 

     private void sqlDep_OnChange(object sender, SqlNotificationEventArgs e) 
     { 
      // FROM: http://msdn.microsoft.com/en-us/a52dhwx7.aspx 

      if (e.Type == SqlNotificationType.Change) 
      { 
      //++++++ THIS IS THE BLOCK THAT IS NEVER TRIGGERED ++++++// 
       // Have to remove this as it only work's once 
       SqlDependency sqlDep = sender as SqlDependency; 
       sqlDep.OnChange -= sqlDep_OnChange; 

       // Resetup Dependecy 
       SetupSQLDependency(); 
      } 
      else if (e.Type == SqlNotificationType.Subscribe) 
      { 
       double te = 12; // Used this just to test a break... code is useless 
      } 
     } 
+0

Можете ли вы уточнить, где этот код существует, как он называется? Например, если этот код существует в 'Page' и вызывается в событии OnLoad, тогда вы должны помнить, что ваш класс страницы жив только в течение секунды секунды, пока страница отображается, а затем весь новый класс для каждого запроса. Таким образом, ваша подписка на события и экземпляр переменной 'sqlCmd' не поддерживаются (и теоретически возникают утечки памяти). – CodingGorilla

+0

Сделали изменения выше – keynesiancross

+0

ОК, по какой-то причине я думал, что вы делаете это в ASP.NET. Так что ваш 'SqlNotificationType.Change' огонь один раз и только один раз или вообще никогда? – CodingGorilla

ответ

1

Я считаю, что проблема здесь COUNT. Обратитесь к MSDN documentation for Supported SELECT Statements для получения дополнительной информации:

Прогнозируемых столбцы в ЗЕЬЕСТЕ не могут содержать агрегатные выражения, если оператор не использует GROUP BY выражения. Когда предоставляется выражение GROUP BY, список выбора может содержать агрегированные функции COUNT_BIG() или SUM(). [...]

+0

, вы правы - я понял, что немного назад, но забыл обновить это. Спасибо за это. Я закончил просто повторное обращение к БД каждые несколько секунд .... – keynesiancross