У меня проблема при использовании SQLDependency
и SignalR Hub. Когда соединение с концентратором запускается, событие SQLDependency
OnChange
всегда срабатывает, даже если в базе данных нет изменений.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()
, он не запускает событие при изменении данных в таблице. Как это можно зафиксировать?
Но когда я проверяю e.Type во-первых, он не дает никакого результата, даже если база данных изменяется. Что случилось с моим кодом? @jjj –
@HandaruEriPramudiya; Вы говорили, что событие «OnChange» всегда срабатывает, хотя изменений нет »- для одной подписки вы будете уведомлять не чаще одного раза, поэтому всякий раз, когда вызывается' dependency_OnChange', подписка больше не активна. Но если он вызывается с 'e.Type == SqlNotifcationType.Subscribe', то подписка не удалась. – jjj