использую в signalR
public class ExampleHub : Hub, ITransientDependency
{
public override Task OnConnected()
{
Storage.ConnStr = WebConfigurationManager.ConnectionStrings["Default"].ConnectionString;
SqlDependency.Start(Storage.ConnStr);
Storage.Connection = new SqlConnection(Storage.ConnStr);
Storage.Connection.Open();
Storage.Command = new SqlCommand("SELECT [State] FROM[Test].[dbo].[State]", Storage.Connection);
Storage.Dependency = new SqlDependency(Storage.Command);
Storage.Dependency.OnChange += Dependency_OnChange;
Storage.Command.ExecuteReader();
.......
private void Dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
}
......
public static class Storage
{
public static bool IsEnabled;
public static SqlConnection Connection;
public static SqlCommand Command;
public static SqlDependency Dependency;
public static string ConnStr;
}
Dependency_OnChange вызывается сразу после ExecuteReader и только 1 раз, во время изменений в базе ничего не происходит
Здравствуйте, -rsdn-, Вы писали:
R>Dependency_OnChange вызывается сразу после ExecuteReader и только 1 раз, во время изменений в базе ничего не происходит
Попробуйте сделать тест без использования SignalR — просто проверить, что сам SqlDependency работает
Выражение для отслеживания выглядит, вроде бы правильно.
Поэтому попробуйте посмотреть в логах SQL Server — нет ли там ошибок.
У меня, например, не так давно возникла та же проблема — не приходили уведомления об изменениях.
В логах обнаружилось сообщение
An exception occurred while enqueueing a message in the target queue. Error: 15404, State: 19. Could not obtain information about Windows NT group/user 'DOMAIN\Mihail_Romanov', error code 0x54b.
Оказалось, что я постоянно работаю с SQL из-под своей учетной записи, и база создается от моего имени (т.е. владельцем базы ставится моя доменная учетная запись — она спроецирована на dbo), а владелец базы нужен для каких-то внутренних телодвижений с очередью событий.
Проблема решилась сменой dbo на sa:
sp_changedbowner 'sa'
Может и у вас что-то в этом роде.
Здравствуйте, Михаил Романов, Вы писали:
МР>Здравствуйте, -rsdn-, Вы писали:
R>>Dependency_OnChange вызывается сразу после ExecuteReader и только 1 раз, во время изменений в базе ничего не происходит
МР>Попробуйте сделать тест без использования SignalR — просто проверить, что сам SqlDependency работает
МР>Выражение для отслеживания выглядит, вроде бы правильно.
МР>Поэтому попробуйте посмотреть в логах SQL Server — нет ли там ошибок.
МР>У меня, например, не так давно возникла та же проблема — не приходили уведомления об изменениях.
МР>В логах обнаружилось сообщение
МР>An exception occurred while enqueueing a message in the target queue. Error: 15404, State: 19. Could not obtain information about Windows NT group/user 'DOMAIN\Mihail_Romanov', error code 0x54b.
МР>Оказалось, что я постоянно работаю с SQL из-под своей учетной записи, и база создается от моего имени (т.е. владельцем базы ставится моя доменная учетная запись — она спроецирована на dbo), а владелец базы нужен для каких-то внутренних телодвижений с очередью событий.
МР>Проблема решилась сменой dbo на sa:
МР>sp_changedbowner 'sa'
МР>Может и у вас что-то в этом роде.
Было
Service Broker needs to access the master key in the database 'Test'. Error code:32. The master key has to exist and the service master key encryption is required.
сделал так
http://www.sqlcoffee.com/Troubleshooting109.htm
ошибка в логах пропала, но все по прежнему
кстати да — пробую без SignalR в WinForms по нажатию на кнопку
Здравствуйте, -rsdn-, Вы писали:
R>использую в signalR
R>R> public class ExampleHub : Hub, ITransientDependency
R>{
R> public override Task OnConnected()
R> {
R> Storage.ConnStr = WebConfigurationManager.ConnectionStrings["Default"].ConnectionString;
R> SqlDependency.Start(Storage.ConnStr);
R> Storage.Connection = new SqlConnection(Storage.ConnStr);
R> Storage.Connection.Open();
R> Storage.Command = new SqlCommand("SELECT [State] FROM [Test].[dbo].[State]", Storage.Connection);
R> Storage.Dependency = new SqlDependency(Storage.Command);
R> Storage.Dependency.OnChange += Dependency_OnChange;
R> Storage.Command.ExecuteReader();
R>.......
R> private void Dependency_OnChange(object sender, SqlNotificationEventArgs e)
R> {
R> }
R>......
R> public static class Storage
R> {
R> public static bool IsEnabled;
R> public static SqlConnection Connection;
R> public static SqlCommand Command;
R> public static SqlDependency Dependency;
R> public static string ConnStr;
R> }
R>
R>Dependency_OnChange вызывается сразу после ExecuteReader и только 1 раз, во время изменений в базе ничего не происходит
надо было удалить название базы [Test].