更改数据集时,SqlDependency不会触发OnChange事件

时间:2016-12-10 11:53:07

标签: c# sql-server windows-services sqldependency

我对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()

任何人都可以帮助我理解这个过程吗?

1 个答案:

答案 0 :(得分:2)

事件触发后将删除SqlDependency,因此您需要使用依赖项再次执行该命令。下面是一个控制台应用程序示例,除非通知是由于错误导致的,否则将再次订阅。

@extends('common_template')

@section('content')
    {{$data['title']}}
@endsection