2015-02-03 2 views
2

У меня проблема при использовании SQLDependency и SignalR Hub. Когда соединение с концентратором запускается, событие SQLDependencyOnChange всегда срабатывает, даже если в базе данных нет изменений.SQLDependency OnChange событие, создающее бесконечный цикл

Вот мой код, который содержит SQLDependency

public List<NotifCenterModel> countNewTransaksi() 
{ 
    List<NotifCenterModel> ncms = new List<NotifCenterModel>(); 
    command = new SqlCommand(@"SELECT Edolpuz_DB.dbo.TABEL_NOTIF_CENTER.NAMA_TABEL,Edolpuz_DB.dbo.TABEL_NOTIF_CENTER.JUMLAH_NOTIF FROM Edolpuz_DB.dbo.TABEL_NOTIF_CENTER",connect); 
    try 
    { 
     command.Notification = null; 
     SqlDependency dependency = new SqlDependency(command); 
     dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); 
     if(connect.State == ConnectionState.Open) 
      connect.Close(); 
     connect.Open(); 
     reader = command.ExecuteReader(); 
     while (reader.Read()) 
     { 
      ncms.Add(new NotifCenterModel(reader[0].ToString(), int.Parse(reader[1].ToString()))); 
     } 
     return ncms; 
    } 
    catch { return null; } 
    finally { connect.Close(); } 
} 

private void dependency_OnChange(object sender, SqlNotificationEventArgs e) 
{ 
    TransHub.Show(); 
} 

и в моем концентратором код, как этот

public class TransHub : Hub 
{ 
    public static void Show() 
    { 
     IHubContext context = GlobalHost.ConnectionManager.GetHubContext<TransHub>(); 
     context.Clients.All.displayStatus(); 
    } 
} 

и вот мой Javascript

$(function() { 
      // Proxy created on the fly 
      var job = $.connection.transHub; 
      // Declare a function on the job hub so the server can invoke it 
      job.client.displayStatus = function() { 
       //  alert("test"); 
       getData(); 
      }; 

      // Start the connection 
      $.connection.hub.start().done(function() { 
       getData(); 
      }).fail(function (e) { 
       alert(e); 
      }); 

     }); 

function getData() { 
    $.ajax({ 
     url: server + '/Admin/GetNotifikasi/', 
     type: 'GET', 
     dataType: 'json', 
     success: function (data) { 
      for (var i = 0; i < data.length ; i++) 
      { 
       if (data[i].nama_tabel == "TABEL_TRANSAKSI") 
       {  
        $('#notifTrans').text(data[i].jumlah_notif); 
       } 
       else if (data[i].nama_tabel == "TABEL_KONF_BAYAR") 
       { 
        $('#notifBayar').text(data[i].jumlah_notif); 
       } 
       else if (data[i].nama_tabel == "TABEL_TESTI") 
       { 
        $('#notifTesti').text(data[i].jumlah_notif); 
       } 
       else if (data[i].nama_tabel == "TABEL_KUSTOM_ORDER") 
       { 
        $('#notifKustom').text(data[i].jumlah_notif); 
       } 
      } 
     } 
    }); 
} 

Когда в connection.hub.start().done I звоните getData(), он будет постоянно стрелять и производить бесконечный цикл, но когда я не вызываю getData(), он не запускает событие при изменении данных в таблице. Как это можно зафиксировать?

ответ

0

В dependency_OnChange необходимо проверить e.Type. Если это != SqlNotificationType.Change, тогда обработчик был вызван по какой-то причине, кроме изменения данных. Вероятно, сама подписка не удалась.

+0

Но когда я проверяю e.Type во-первых, он не дает никакого результата, даже если база данных изменяется. Что случилось с моим кодом? @jjj –

+0

@HandaruEriPramudiya; Вы говорили, что событие «OnChange» всегда срабатывает, хотя изменений нет »- для одной подписки вы будете уведомлять не чаще одного раза, поэтому всякий раз, когда вызывается' dependency_OnChange', подписка больше не активна. Но если он вызывается с 'e.Type == SqlNotifcationType.Subscribe', то подписка не удалась. – jjj

 Смежные вопросы

  • Нет связанных вопросов^_^