事件发生时,SqlDependency OnChange不会触发

时间:2017-04-03 23:22:43

标签: c# sql-server asp.net-mvc signalr sqldependency

我知道在SO上有一个类似的问题有答案,在阅读了这篇文章和其他文章之后,我仍然不确定为什么我无法正确连接。我已经尝试了很多例子,并尝试过不同的东西,而且根本无法让它发挥作用。我知道有重构的机会,但我现在试图保持简单,只是为了让它先工作。

我拥有数据库的权限,我可以看到创建了一个临时服务和队列。我注意到的一件事是,如果我运行查询,队列不会显示任何记录,并且我的dependency_OnChange事件不会被触发。我假设它没有被解雇,因为没有任何东西进入队列......

更新:我现在要点击它,但是,我得到的唯一事件是SubscribeSqlNotificationEventArgs显示Invalid Info,但我的查询和表格匹配sql依赖项的所有SELECT规则。

的Global.asax:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    SqlDependency.Start(_entityConnString);
}

protected void Application_End()
{
    SqlDependency.Stop(_entityConnString);
}

InfectionPreventionHub.cs: (这是一个以某个区域启动的简单SignalR Hub)

    /// <summary>
    /// Sends the notifications.
    /// </summary>
    [HubMethodName("sendUpdates")]
    private void SendUpdates()
    {
        var infectionPreventionItems = InfectionPreventionOperations.GetInfectionPrevention();

        var vm = new InfectionPreventionViewModel
        {
            InfectionPrevention = infectionPreventionItems
        };

        var result = JsonConvert.SerializeObject(vm);

        GetUpdates();

        IHubContext context = GlobalHost.ConnectionManager.GetHubContext<InfectionPreventionHub>();
        context.Clients.All.RecieveUpdates(result);
    }

    /// <summary>
    /// Gets the updates.
    /// </summary>
    private void GetUpdates()
    {
        const string commandText = @"SELECT [Id], [FirstName] FROM [TestDb].[dbo].[Association]";

        using (var connection = new SqlConnection(EntityConnString))
        {
            connection.Open();

            using (var command = new SqlCommand(commandText, connection))
            {
                command.Notification = null;

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

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

                // NOTE: You have to execute the command, or the notification will never fire.
                using (var reader = command.ExecuteReader())
                {
                }
            }
        }
    }

    /// <summary>
    /// Handles the OnChange event of the sqlDependency control.
    /// </summary>
    /// <param name="sender">The source of the event.</param>
    /// <param name="e">The <see cref="SqlNotificationEventArgs"/> instance containing the event data.</param>
    private void sqlDependency_OnChange(object sender, SqlNotificationEventArgs e)
    {
        // TODO: Check for the type of event
        GetUpdates();
        SendUpdates();
    }

将它连接到RavenDB真的很容易,但是SqlServer让我很难过。

GetUpdates仅在集线器连接发生时触发一次,我认为这会启动依赖关系。但是,在更新或向Association表添加内容时,不会引发任何事件。我需要使用SignalR进行用户界面的实时更新,并且数据将通过第三方工具输入。任何帮助表示赞赏。

0 个答案:

没有答案