SqlDependency无法运行mvc app。点击一次

时间:2017-05-15 11:27:26

标签: asp.net-mvc signalr sqldependency

我正在关注博客http://www.venkatbaggu.com/signalr-database-update-notifications-asp-net-mvc-usiing-sql-dependency/,以便向已连接的客户端发送signalR推送消息。 我的调试器永远不会遇到onchange事件。

我的Global.asax.cs:

string connString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;

protected void Application_Start()
{
     // basic stuff
     SqlDependency.Start(connString);
     var repo = new Repositories.MarkerRepository();
     repo.GetAllMarkers(); // to register the dependency
}

我的MarkerRepository.cs:

    readonly string _connString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
    private MarkersHub _mh = new MarkersHub(); // my signalr hub class

    public IEnumerable<House> GetAllMarkers()
    {
        var markers = new List<House>();
        using (var connection = new SqlConnection(_connString))
        {
            connection.Open();
            using (var command = new SqlCommand(@"SELECT * FROM [dbo].Houses", connection))
            {
                command.Notification = null;

                var dependency = new SqlDependency(command);
                dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);

                if (connection.State == ConnectionState.Closed)
                    connection.Open();

                var reader = command.ExecuteReader();

                while (reader.Read())
                {
                    markers.Add(item: new House {
                        ID        = (int)reader["ID"],
                        Name      = (string)reader["Name"],
                        Code      = reader["Code"] != DBNull.Value ? (string)reader["Code"] : "",
                        Latitude  = Convert.ToDouble(reader["Latitude"]),
                        Longitude = Convert.ToDouble(reader["Longitude"])
                    });
                }
            }

        }
        return markers;
    }

    private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
    {
        if (e.Type == SqlNotificationType.Change)
        {
            _mh.SendMarkers();
        }
    }

我曾经受过一次打击,但没有变化,只有订阅通知。我已经阅读了很多关于重新订阅的内容,但是当它遇到这个事件时,sql:

select * from sys.dm_qn_subscriptions

仍然没有返回任何行。不在我的数据库或主人。所以我认为重新订阅更改活动的博文中有错误?此示例https://msdn.microsoft.com/en-us/library/a52dhwx7(VS.80).aspx在onchange事件中取消注册,并调用注册新事件的方法。有人可以验证我的假设吗?

1 个答案:

答案 0 :(得分:0)

这些是我活动中SqlNotificationEventArgs e的值,并告诉我依赖的查询无效。

SqlNotificationEventArgs.Type - &gt; SqlNotificationType.Subscribe

SqlNotificationEventArgs.Info - &gt; SqlNotificationInfo.Invalid

SqlNotificationEventArgs.Source - &gt; SqlNotificationSource.Statement

  

该语句可能不使用星号()或table_name。语法来指定列。

来源https://msdn.microsoft.com/en-us/library/ms181122.aspx