2015-12-03 43 views
1

我試圖在SignalR項目中使用SqlDependancy,但我似乎無法讓OnChanged事件觸發多次。它首先在訂閱事件上觸發,但在對底層數據庫進行更改後,它再也不會觸發。我省略了我的SignalR和控制器代碼,因爲問題似乎存在於存儲庫類中。 SqlDependancy.Start()在我的Global.asax類中聲明。SqlDependency僅在訂閱時觸發

從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/zh-CN/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,「在Windows應用程序中使用SqlDependency」是原始鏈接的部分。請特別注意觀察者應用程序中的步驟12和13。在步驟12中,您將看到onChange事件的刪除,然後調用步驟13再次設置它。

另外,我認爲你看到由於你的sql語句本身的不良行爲。 sql語句必須遵循一些規則。有關更多信息,請參閱https://technet.microsoft.com/en-us/library/ms181122(v=sql.105).aspx。特別是撰寫通知查詢部分。 「該聲明可能不使用星號(*)或table_name。*語法來指定列。」

+0

這兩個鏈接都壞了,你能更新它們嗎?我有同樣的問題! – DiegoS

+0

我已經更新了答案。第一個鏈接導致您必須下載文檔以查看我所指的內容。我將第二個鏈接更新爲工作鏈接。 – Dave

+0

我正在使用星號(*),但在刪除它後,它現在看到了Change事件。謝謝 –