SignalR 和 sql 仅依赖于插入



我在 asp.net mvc 5.2 中使用 signalR 和 SQL 依赖项进行实时通知我从这个链接实现SignalR

http://venkatbaggu.com/signalr-database-update-notifications-asp-net-mvc-usiing-sql-dependency/
不,我

有一个问题,在这种情况下对表的任何更改,SQL依赖项运行并返回记录,我只想在表中插入SQL依赖项并返回记录,

因为在此表中,当我更新触发的归档 SQL 依赖项时,我在面板中更新了用户读取通知的位归档

如何仅为插入表定义SQL依赖项?

谢谢你的帮助

我使用此代码

 public IEnumerable<Messages> GetAllMessages()
        {
            var messages = new List<Messages>();
            using (var connection = new SqlConnection(_connString))
            {
                connection.Open();
                using (var command = new SqlCommand(@"SELECT [Id],[Player_Id], [Message] FROM [dbo].[Notification] WHERE [Player_Id] = " + PlayerLogin.userId + " AND PlayerIsRed = 0", connection))
                {
                    command.Notification = null;
                    var dependency = new SqlDependency(command);
                    dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
                    if (connection.State == ConnectionState.Closed)
                        connection.Open();
                    var reader = command.ExecuteReader();
                    while (reader.Read())
                    {
                        messages.Add(item: new Messages { Id = (int)reader["Id"], Message = (string)reader["Message"], Player_Id = (int)reader["Player_Id"] });
                    }
                }
            }
            return messages;
        }

你可以使用你的SqlDependency 函数,如下所示:

     void sqlDep_OnChange(object sender, SqlNotificationEventArgs e)
            {
                if (e.Type == SqlNotificationType.Change && e.Info==SqlNotificationInfo.Insert)
                {
                    // your code
                }
            }

不能直接限制 SqlDependency 通知的数据更改类型。Sunil 建议的过滤器将起作用,但还有另一种解决方法可以只收到插入通知:触发器。

可以在要通知的表上放置一个插入触发器,并让该触发器另一个表(如 PlayerNotification)上插入记录,然后将 SqlDependency 查询指向PlayerNotification

CREATE TRIGGER [dbo].[NotificationTrigger] ON [dbo].[Notification]
FOR INSERT
AS
BEGIN
    INSERT INTO 
        [dbo].[PlayerNotification] ( 
              [Id], [Player_Id], [Message] )
    SELECT DISTINCT 
          [Id], [Player_Id], [Message]
    FROM 
        Inserted i
END

最新更新