SQLDependency OnChange事件产生无限循环

问题描述 投票:3回答:2

使用SQLDependency和SignalR Hub时遇到问题。当启动与集线器的连接时,即使数据库中没有任何更改,SQLDependencyOnChange事件也始终会触发。

这是我的代码,包含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();   
}

在我的Hub中代码就是这样

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中调用getData()时,它将不断触发并产生无限循环,但是当我不调用getData()时,它不会在表中的数据发生变化时触发事件。怎么解决这个问题?

javascript c# asp.net-mvc-4 signalr-hub sqldependency
2个回答
0
投票

dependency_OnChange,你需要检查e.Type。如果它是!= SqlNotificationType.Change,则由于某些原因而不是数据更改而调用处理程序。订阅本身可能失败了。


0
投票

根据此站点(https://docs.microsoft.com/en-us/previous-versions/aewzkxxh(v=vs.90)),查询中的表名必须是两部分名称,如[dbo]。[TABEL_NOTIF_CENTER]。

必须明确声明SELECT语句中的预计列,并且必须使用两部分名称限定表名。请注意,这意味着语句中引用的所有表必须位于同一数据库中。

[]的

© www.soinside.com 2019 - 2024. All rights reserved.