Я пытаюсь настроить 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;