有没有更好的方法来获取有关SQL SERVER数据库更改的通知?

时间:2015-05-27 09:34:01

标签: c# .net sql-server

这可能是一个愚蠢的问题,但请帮我解释一下。

我有一个带有表的SQL数据库,只要表中有行添加/删除/更新..(任何操作),就应该通过在系统中运行的桌面c#应用程序提供通知托盘。

  

SQL SERVER中已有通知邮件发送机制   但我不想通过邮件通知。

下面的邮件通知屏幕:

enter image description here

即使通过管理工作室修改数据库,还有更好的方法通过应用程序获取通知吗?

  

我曾经检查过行数,如果有计数则会收到通知   增加/减少我会收到有关插入/删除的通知   行。

但那并不适用于更新!

修改1:

如果可能存在针对 SqlDependency this Stack Overflow post answer等限制情况的可能性,该如何克服?

2 个答案:

答案 0 :(得分:1)

也许您正在寻找SqlDependency

更具体地说,是OnChange事件。

(还有SqlCommand.Notification属性)

答案 1 :(得分:0)

我为你做了一个小样本

为每个表创建一个插入,更新和删除的触发器。也许为每个表使用History表,这样也可以记录所有更改

按如下方式创建表

Create Table Notifications
(
 Id bigint Identity(1,1) Not null,
 TableName nvarchar(250),
 ChangedOn DateTime,
 Notified bit
)

每次触发事件时,请在通知表中写入以下值:

Insert Into Notifications
(TableName, ChangedOn, Notified)
Values
('YourTableName', GetDate(), 0)

使用easy计时器创建一个应用程序,该计时器将定期检查表值,如下所示:

即:C#

private List<Notification> _notificationsToShow;

Private void DoNotify()
{
    var notifs = Notifications.Where(t=> !t.Notified).ToList();
    if(notifs.Count > 0)
    {
        _notificationsToShow.AddRange(notifs);            
        foreach(var Notification in notifs)
        {
            //Save to database as user is notified
            Notification.Notified = true;
            Notification.Save(); 
        }            
    }
    DoSomethingAlertish();
}

private void DoSomethingAlertish()
{  
    if(_notificationToShow.Count == 0 || _notificationToShow == null)
        return;

    var s = new StringBuilder();
    foreach(var v in _notificationToShow)
    {
        s.AppendLine(v.TableName);
    }
    alert(s.ToString());
}

//Create an event that will empty the list (user must do trigger this action)
private void UserNotifiedAction() 
{
    _notificationToShow = new List<Notification>();
    DoSomethingAlertish();
}

此方法的缩小如下:

必须创建每个表触发器的

。这意味着每个表有3个触发器

所以当你有一个小应用程序,例如15个表时,这已经意味着创建了45个触发器,现在确实考虑了1000个表的情况,你明白了。

另外,请注意,通知表会像疯子一样增长。所以也许你需要偶尔清理它。

良好部分是在创建所有触发器并将值存储在表中之后,您可以使用任何可用的技术来创建通知。你现在想要它在托盘栏中,也许将来你仍然想要一个邮件,一切都在运行并收集你所有的价值,你必须考虑的唯一部分就是用什么技术来调用它。

我希望我能为您提供一个可以在将来帮助您的解决方案。再一次,你问的解决方案可能更简单,但这取决于你未来的目标。