【发布时间】:2016-12-10 11:53:07
【问题描述】:
我是 SQL Server 查询通知概念的新手,我需要一些时间来理解它。
我的目标是创建一个 Windows 服务应用程序,当 SQL Server 表发生更改时它会收到通知。我遵循了this 指南,这对我开始很有帮助。
但是我无法获得预期的结果。我的 Windows 服务应用程序中的 OnStart() 方法如下所示:
protected override void OnStart(string[] args)
{
eventLog1.WriteEntry("Service Started");
serviceRun = false;
SqlClientPermission perm = new SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted);
try
{
perm.Demand();
eventLog1.WriteEntry("permission granted");
}
catch (System.Exception)
{
eventLog1.WriteEntry("permission denied");
}
try
{
connstr = "Data Source=THSSERVER-LOCAL;Initial Catalog=ET;User ID=mujtaba;Password=ths123";
connection = new SqlConnection(connstr);
SqlCommand command = new SqlCommand("select * from dbo.Customer_FileUploads", connection);
// Create a dependency and associate it with the SqlCommand.
SqlDependency dependency = new SqlDependency(command);
// Maintain the reference in a class member.
// Subscribe to the SqlDependency event.
dependency.OnChange += Dependency_OnChange;
SqlDependency.Start(connstr);
connection.Open();
// Execute the command.
using (SqlDataReader reader = command.ExecuteReader())
{
if (reader.HasRows)
{
while (reader.Read())
{
//eventLog1.WriteEntry("reading data");
}
}
else
{
eventLog1.WriteEntry("No rows found.");
}
reader.Close();
}
}
catch (Exception e)
{
eventLog1.WriteEntry("Error Message: " + e.Message);
}
}
订阅了SqlDependency 的事件,如下所示:
private void Dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
// Handle the event.
eventLog1.WriteEntry("data changed");
}
OnStop() 方法如下所示:
protected override void OnStop()
{
SqlDependency.Stop(connstr);
connection.Close();
eventLog1.WriteEntry("In onStop.");
}
我在我的数据库中将ENABLE_BROKER 设置为true。最终结果是,服务运行并创建了以下日志:
"Service Started"
"permission granted"
"data changed"
但是,当我将新数据插入表中时,OnChange() 事件不会触发并且不会创建新日志。此外,当我停止并再次启动服务时,即使没有插入新数据,也会触发OnChange()。
谁能帮我理解这个过程?
【问题讨论】:
-
我也遇到了同样的情况,收到了无效的通知信息。这是因为查询是“SELECT 1 FROM database.squema.table”,删除查询中的数据库,如“SELECT 1 FROM schema.table”解决问题。
标签: c# sql-server windows-services sqldependency