Я не могу заставить SqlDependency сработать, я делаю что-то явно не так? - PullRequest
2 голосов
/ 11 марта 2020

Я пытаюсь настроить SqlDependency, чтобы моему приложению Winforms не приходилось перегружать сервер с помощью 1 секунды повторяющихся запросов на выборку, чтобы узнать, изменилось ли значение таблицы. Я избавился от всех возникших исключений, но все еще не могу заставить его сработать.

Я создал очередь и службу в базе данных, и я использую SQL учетную запись сервера, которая имеет все насколько я могу судить, необходимые разрешения (подключение, управление, создание процедуры, создание очереди, создание службы, выполнение и уведомление о запросе на подписку).

Я застрял на некоторое время на InvalidOperationException, когда я использовал эту строку для создания зависимости:

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

SqlDataReader reader = command.ExecuteReader(); выдает следующее исключение:

System.InvalidOperationException: 'При использовании SqlDependency без предоставления значения параметров, SqlDependency .Start () должен вызываться до выполнения команды, добавленной к экземпляру SqlDependency. '

Я добавил параметры и параметры времени ожидания, и это исключение прекратилось, но я не уверен, что оно действительно исправило основная проблема.

Это новая строка:

// 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' (exec GetCurrentRequests), и после истечения времени ожидания другая процедура вызывается RequestUpdateMessages (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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...