SQL Server通知-我的OnChange不会从windows服务触发

本文关键字:windows 服务 通知 Server 我的 OnChange SQL | 更新日期: 2023-09-27 18:07:35

我想利用SQL Server通知来捕获windows服务中数据库的插入/更新事件。我正在尝试使用SQLDependency对象。MSDN的文章让这看起来很直接。因此,我创建了一个小示例应用程序来进行尝试。当对表中的数据进行更改时,它不会引发OnChange事件。有人能告诉我我错过了什么吗?谢谢!下面是我的代码示例:

private bool CanRequestNotifications()
{
    SqlClientPermission permit = new
    SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted);
    try
    {
        permit.Demand();
        return true;
    }
    catch (System.Exception exc)
    {
        return false;
    }
}
private void NotificationListener()
{
    string mailSQL;
    SqlConnection sqlConn;
    try
    {
        string connString = "Data Source=xyz;Initial Catalog=abc;User ID=sa;Password=******";
        mailSQL = "SELECT * FROM [tbl_test]";
        SqlDependency.Stop(connString);
        SqlDependency.Start(connString);
        sqlConn = new SqlConnection(connString);
        SqlCommand sqlCmd = new SqlCommand(mailSQL, sqlConn);
        this.GetNotificationData();
        evtLog.WriteEntry("Error Stage: NotificationListener" + "Error desc:" + "Message", EventLogEntryType.Error);
    }
    catch (Exception e)
    {
        // handle exception
    }
}
private void GetNotificationData()
{
    DataSet myDataSet = new DataSet();
    SqlCommand sqlCmd = new SqlCommand();
    sqlCmd.Notification = null;
    SqlDependency dependency = new SqlDependency(sqlCmd);
    dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
    evtLog.WriteEntry("Error Stage: GetNotificationData" + "Error desc:" + "Message", EventLogEntryType.Error);
}
private void dependency_OnChange(object sender,SqlNotificationEventArgs e)
{
    SqlDependency dependency = (SqlDependency)sender;
    dependency.OnChange -= dependency_OnChange;
    this.GetNotificationData();
    evtLog.WriteEntry("Error Stage: dependency_OnChange" + "Error desc:" + "Message", EventLogEntryType.Error);
}
protected override void OnStart(string[] args)
{
    CanRequestNotifications();
    NotificationListener();
}
protected override void OnStop()
{
    SqlDependency dependency = new SqlDependency();
    dependency.OnChange -= dependency_OnChange;
    SqlDependency.Stop(connString);
}

SQL Server通知-我的OnChange不会从windows服务触发

似乎您正在为每个操作使用一个新的SqlDependency实例-从长远来看,这不会起作用;你应该有一个对单个实例的引用,这些引用可以被需要它的代码部分访问——这可能有助于解决你的问题。

而且,我实际上看不到你在改变任何数据,你创建了连接和命令,但是没有执行