2015-12-03 1 views
1

Я пытаюсь использовать SqlDependancy в проекте SignalR, но я не могу заставить событие OnChanged срабатывать более одного раза. Сначала он запускается в событии подписки, но после внесения изменений в базовую базу данных он никогда не срабатывает. Я опустил свой код SignalR и контроллера, потому что проблема, похоже, лежит в классе репозитория. SqlDependancy.Start() объявлен в моем классе Global.asax.SqlDependency Only Fire On On Подписывается

Наблюдая за SQL-сервером, я вижу, что очередь уведомлений создается при запуске моего приложения и завершается, когда я закрываю.

public IEnumerable<Visitor> NotifyAllClients() 
    { 
     List<Visitor> visitors = new List<Visitor>(); 
     using (var connection = new SqlConnection(new VisitorLogEntities().Database.Connection.ConnectionString)) 
     { 
      using (var command = new SqlCommand(@"SELECT * FROM dbo.Visitors", connection)) 
      //using (var command = new SqlCommand(@"SELECT [Id],[AgreeToTerms],[Base64Image],[CheckInDate],[CheckOutTime],[Company],[CountryOfOrigin],[email],[FirstName],[LastName],[IsInBuilding],[MeetingSubject],[MeetingTime],[PatriotHost],[phone],[title] FROM dbo.Visitors", connection)) 
      { 

       var dependency = new SqlDependency(command); 
       dependency.OnChange += Database_OnChange; 

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

       var reader = command.ExecuteReader(); 

       while (reader.Read()) 
       { 
       ////compile visitor objects 
       ////visitors.add(new Visitor()); 
       } 
      } 
      return visitors.OrderByDescending(x => x.CheckInDate); 
     } 
    } 

    private void Database_OnChange(object sender, SqlNotificationEventArgs e) 
    { 
     //var dependency = (SqlDependency)sender; 
     //dependency.OnChange -= Database_OnChange; 

     ////this fires once, with the Type of 'Subscribe', but then never fires on CRUD changes 
     if (e.Type == SqlNotificationType.Change) 
     { 
      VisitorHub.SendVisitors(); 
     } 
     //NotifyAllClients(); 
    } 

редактировать: строки кода закомментирована выше, указывают на изменения, необходимые, чтобы получить эту работу правильно.

+1

Я считаю, что вам нужно переписаться после каждого уведомления. http://stackoverflow.com/questions/15566966/sqldependency-onchange-not-firing – Dave

+0

Я понимаю это, но если я переподписал его, он снова перезапустит обработчик OnChanged с типом «Подписаться». Какая часть кода в точности является повторной подпиской? Я предполагаю, что это метод command.ExecuteReader(), но как только это произойдет, подписка завершена. Где будет проходить эта подписка? –

+0

Проверьте этот пример с помощью msdn https://msdn.microsoft.com/en-US/library/a52dhwx7(v=vs.80).aspx, обращая особое внимание на шаги 12 и 13 в приложении наблюдателя. На шаге 12 вы увидите удаление события onChange, а затем он вызывает шаг 13, который устанавливает его снова. – Dave

ответ

5

Проверьте этот пример с помощью msdn http://msdn.microsoft.com/en-US/library/a52dhwx7(v=vs.80).aspx. Загрузите VS2005_General_en-us.pdf. Страница 24636 «Использование SqlDependency в приложении Windows» - это раздел, к которому привела исходная ссылка. Обратите особое внимание на шаги 12 и 13 в приложении наблюдателя. На шаге 12 вы увидите удаление события onChange, а затем он вызывает шаг 13, который устанавливает его снова.

Кроме того, я думаю, что вы видите плохое поведение из-за своего заявления sql. Заявление sql должно следовать некоторым правилам. См. https://technet.microsoft.com/en-us/library/ms181122(v=sql.105).aspx для получения дополнительной информации. В частности, раздел «Запросы на запись уведомлений». «В заявлении не может использоваться синтаксис asterisk (*) или table_name. * Для указания столбцов».

+0

Обе ссылки не работают, можете ли вы их обновить? У меня такая же проблема! – DiegoS

+0

Я обновил ответ. Первая ссылка ведет к документу, который вы должны загрузить, чтобы узнать, о чем я говорю. Я обновил вторую ссылку на рабочую ссылку. – Dave

+0

Я использовал звездочку (*), но после ее удаления теперь он видит событие Change. благодаря –