C# SQL Server通知-我的OnChange不会从windows服务触发
我想使用SQL Server通知在windows服务中捕获数据库中的插入/更新事件。我正在尝试使用SQLDependency对象。MSDN的文章让这看起来很直截了当。所以我创建了一个小的示例应用程序来尝试一下。在对表中的数据进行更改时,它不会引发看起来像是OnChange的事件。有人能告诉我我错过了什么吗?谢谢下面是我的代码示例C# SQL Server通知-我的OnChange不会从windows服务触发,c#,sql,windows-services,service-broker,sqldependency,C#,Sql,Windows Services,Service Broker,Sqldependency,我想使用SQL Server通知在windows服务中捕获数据库中的插入/更新事件。我正在尝试使用SQLDependency对象。MSDN的文章让这看起来很直截了当。所以我创建了一个小的示例应用程序来尝试一下。在对表中的数据进行更改时,它不会引发看起来像是OnChange的事件。有人能告诉我我错过了什么吗?谢谢下面是我的代码示例 private bool CanRequestNotifications() { SqlClientPermission permit = new Sq
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);
}
似乎您正在为每个操作使用一个新的SqlDependency实例——从长远来看,这是行不通的;您应该有一个对单个实例的引用,该引用可供需要它的代码部分访问——这可能有助于解决您的问题
此外,我实际上看不到您正在更改任何数据,您创建了连接和命令,但没有执行。我将实例更改为单个实例。在服务运行时,我使用SQLManagementStudio将表中的内容直接更改为数据库。我也在windows应用程序中尝试了这个方法,效果很好。我发现很多人都有这样的策略,比如需要从dependency_OnChange事件调用NotificationListener。试试看。