首页 > 解决方案 > 我无法触发 SqlDependency,我做错了什么吗?

问题描述

我正在尝试设置一个SqlDependency,这样我的 Winforms 应用程序就不必通过 1 秒重复选择查询来确定表值是否已更改而使服务器陷入困境。我已经摆脱了我遇到的所有异常,但我仍然无法触发它。

我在数据库中创建了一个队列和一个服务,并且我正在使用一个 SQL Server 帐户,据我所知,该帐户具有所有必需的权限(连接、控制、创建过程、创建队列、创建服务、执行和订阅查询通知)。

InvalidOperationException当我使用这条线创建依赖项时,我被困了一段时间:

// create the SQL dependency
sqlDependency = new SqlDependency(command);

SqlDataReader reader = command.ExecuteReader();抛出以下异常:

System.InvalidOperationException:“在不提供选项值的情况下使用 SqlDependency 时,必须在执行添加到 SqlDependency 实例的命令之前调用 SqlDependency.Start()。”

我添加了选项和超时参数,并且该异常停止发生,但我不确定它是否真的解决了根本问题。

这是新行:

// create the SQL dependency
sqlDependency = new SqlDependency(command, "service=RequestUpdateNotifications;", 0);

https://github.com/dotnet/dotnet-api-docs/issues/1670

使用 SQL Server Profiler,我可以看到GetCurrentRequests“.NET SqlClient Data Provider”()调用了存储过程() ,超时后,“RequestUpdateMessages”( )exec GetCurrentRequests调用了另一个过程exec sp_executesql N'WAITFOR(RECEIVE TOP (1) message_type_name, conversation_handle, cast(message_body AS XML) as message_body from [RequestUpdateMessages]), TIMEOUT @p2;',N'@p2 int',@p2=60000

我的问题是我不能OnDependencyChange()开火。我尝试使用我的应用程序通过存储过程更改表中的值,并尝试使用 SSMS 插入/更新值无济于事。希望我错过了一些简单的事情,但我已经在谷歌上搜索和调整了几个小时,但我无法让它工作。

C#

internal DatabaseComms(string databaseIp, string databaseName)
{
    connectionString = "Password=****;Persist Security Info=True;User ID=****;InitiaCatalog="
        + databaseName + ";Data Source=" + databaseIp + ";";

    SqlDependency.Start(connectionString, "RequestUpdateMessages");

    using (SqlConnection sql = new SqlConnection(connectionString))
    {
        // Setup the SQL Command
        SqlCommand command = new SqlCommand("GetCurrentRequests", sql);
        command.Connection.Open();
        command.CommandType = CommandType.StoredProcedure;

        // create the SQL dependency
        sqlDependency = new SqlDependency(command, "service=RequestUpdateNotifications;", 0);

        // Subscribe to the SqlDependency event.
        sqlDependency.OnChange += new
           OnChangeEventHandler(OnDependencyChange);

        // execute the command
        SqlDataReader reader = command.ExecuteReader();
        reader.Close();

        // Dispose of the command
        command.Dispose();
    }
}

void OnDependencyChange(object sender, SqlNotificationEventArgs e)
{
    throw new NotImplementedException();
}

SQL

ALTER DATABASE ServiceHub SET ENABLE_BROKER;

CREATE QUEUE RequestUpdateMessages;  

CREATE SERVICE RequestUpdateNotifications  
  ON QUEUE RequestUpdateMessages;

标签: c#.netsql-serverssms

解决方案


推荐阅读