c# - SqlDependency OnChange 事件为数据库中的每个事件触发多次

标签 c# asp.net webforms signalr sqldependency

我正在使用 SqlDependency 和 signalR 开发一个通知系统,我无法处理的问题是当我根据与会者状态将数据库中的属性值“IsOnline”更改为 True 或 False 时,OnChange 事件多次触发,第一次新用户登录时,我收到两个通知,然后第二次收到更多通知,比如 4 个,然后更多。每次有新用户登录或注销时,通知数量都会增加。我确定 SqlDependency 中的问题不在 SignalR 中,我将与您分享我的部分代码。

提前致谢。

  [System.Web.Services.WebMethod]

    public static IEnumerable<AttendeeList> GetAllUsers()
    {
        var AttendeeList = new List<AttendeeList>();

        try
        {
            using (var connection = new SqlConnection(_connString))
            {
                connection.Open();
                string str = "";
                str += "SELECT [AttendeeID], ";
                str += "       [IsAllowToUploadDocuments],";
                str += "       [IsOnline], ";
                str += "       [AttendeeTypeName],";
                str += "       [UserName] ";
                str += "       FROM [dbo].[Meeting_Attendees]   ";
                str += "       INNER JOIN [dbo].[aspnet_Users]  ON [aspnet_Users].[UserId] = [Meeting_Attendees].[AttendeeID] ";
                str += "       INNER JOIN   [dbo].[AttendeeType] ON [dbo].[AttendeeType].[AttendeeTypeID] = [dbo].[Meeting_Attendees].[AttendeeTypeID] ";
                str += "       WHERE [MeetingID]=@MeetingID ORDER BY [IsOnline] DESC";

                using (var command = new SqlCommand(@str, connection))
                {
                    SqlParameter prm = new SqlParameter("@MeetingID", SqlDbType.Int);
                    prm.Direction = ParameterDirection.Input;
                    prm.DbType = DbType.Int32;
                    prm.Value = Convert.ToInt32(Properties.Settings.Default.MeetingID);
                    command.Parameters.Add(prm);
                    command.Notification = null;

                    var dependency = new SqlDependency(command);
                    dependency.OnChange += new OnChangeEventHandler(dependencyUsers_OnChange);

                    if (connection.State == ConnectionState.Closed)
                        connection.Open();

                    var reader = command.ExecuteReader();

                    while (reader.Read())
                    {
                        AttendeeList.Add(item: new AttendeeList { UserName = (string)reader["UserName"], UserType = (string)reader["AttendeeTypeName"], IsOnline = (bool)reader["IsOnline"], IsAllowToUploadDocuments = (bool)reader["IsAllowToUploadDocuments"], IsCurrentUser = true ? (Guid)reader["AttendeeID"] == new Guid(Properties.Settings.Default.UserID.ToString()) : false });
                    }
                }
            }
        }
        catch { }
        return AttendeeList;
    }

    private static void dependencyUsers_OnChange(object sender, SqlNotificationEventArgs e)
    {
        if (e.Type == SqlNotificationType.Change && e.Info == SqlNotificationInfo.Update)
        {
            //Call SignalR  
            MessagesHub.UpdateUsers();
        }
    }

最佳答案

为了确保事件处理程序被注册一次,在“+=”之前执行“-=”:

oDependency.OnChange -= new OnChangeEventHandler(DBUpdateNotificationReeived);
oDependency.OnChange += new OnChangeEventHandler(DBUpdateNotificationReeived);

检查您的 SQL 表是否没有“更新”正在更新的记录的触发器(除了 sqltabledependency 触发器)。

关于c# - SqlDependency OnChange 事件为数据库中的每个事件触发多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31648938/

相关文章:

.net - 在 VS 2010 中查看工作流程

asp.net - 为选中的 CheckBoxField 设置默认 bool 值

javascript - 单击 html 表格内的按钮时如何调用 javascript 函数?

c# - 防止表单重新提交

c# - TextBox.AppendText() 不自动滚动

c# - 模仿/模拟特定的屏幕分辨率来调整 WinForms 的大小?

c# - 在 EF7(核心)OnModelCreating 中使用自定义属性

c# - ASP.NET 中缓存的 Request.IsAuthenticated 问题

c# - 声明具有属性的类并同时填充这些属性的最佳方法是什么

url-routing - ASP.NET 3.5 webforms URL路由问题