代码之家  ›  专栏  ›  技术社区  ›  abney317

SqlDependency OnChange事件多次触发

  •  1
  • abney317  · 技术社区  · 8 年前

    我有一个项目的评论系统,你可以查看不同的页面,他们有自己的评论。我正在尝试使用带有SqlDependency的信号器来自动在页面上提取新注释。 我的问题是,如果多人打开了与SqlDependency的连接,则从sqlnotification调用的“onchange”事件的数量开始成倍增加。每个用户都会多次调用onchange,而不是只调用一次。(即使他们没有查看相同的评论页面)

        private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
        {
            SqlDependency dependency = (SqlDependency)sender;
            dependency.OnChange -= new OnChangeEventHandler(dependency_OnChange);
    
            if (e.Info.ToString().ToLower().Trim() == "insert")
            {
                MyHub.Show();
            }
        }
    

    这对我来说似乎没有任何改变,所以我不知道最好的预防方法是什么。

    GetData方法:

        [WebMethod]
        public IEnumerable<DUpdates> GetData(string dnum, string date)
        {
            if (Common.IsValidInt32(dnum)) //just a function that check for valid int
            {
                using (var connection =
                    new SqlConnection(ConfigurationManager.ConnectionStrings["SConnectionString"].ConnectionString))
                {
    
                    connection.Open();
    
                using (SqlCommand command = new SqlCommand(@"SELECT [Comment] FROM dbo.DUpdates WHERE (DID = " + dnum + ") AND (Deleted = 0) AND CreateDate > @Date ORDER BY CreateDate DESC", connection))
                {
                    command.Parameters.Add("@Date", SqlDbType.DateTime);
                    command.Parameters["@Date"].Value = date;
    
                    command.Notification = null;
    
                    SqlDependency dependency = new SqlDependency(command);
    
                    dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
    
    
                    if (connection.State == ConnectionState.Closed)
                        connection.Open();
    
                    using (var reader = command.ExecuteReader())
                    {
                        return reader.Cast<IDataRecord>().Select(x => new DUpdates()
                        {
                            comment = x.GetString(0)
                        }).ToList();
                    }
                }
            }
        }
    

    JS资料:

        $(function() {
            var job = $.connection.myHub;
    
            job.client.displayStatus = function () {
                getData();
            };
    
            $.connection.hub.start();
            getData();
        });
    
        function getData() {
            var params = (new URL(document.location)).searchParams;
            var id = params.get("id");
            var dt = $("#accessdate").val();
    
            $.ajax({
                url: 'dupdatesservice.asmx/GetData',
                data: JSON.stringify({dnum: id, date: dt}),
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                type: "POST",
                success: function (data) {
                    if (data.d.length > 0) {
                        $("#testdiv").prepend(data.d[0].comment);
                    }
                }
            });
        }
    

    1 回复  |  直到 8 年前
        1
  •  0
  •   abney317    8 年前

    这里的问题是,我为页面上的每个用户(或具有多个窗口的同一用户)创建了一个新的SqlDependency。因此,如果为一个页面打开了两个窗口,那么它将两次检查通知,如果有新内容,则发送两次响应。由于ajax请求,现在所有的SqlDependencies都增加了一倍,所以下次我会得到4个响应,然后是8个,以此类推。