Codes DeCodes Ответов: 1

Signalr не запускает событие C# при изменениях в таблице БД


Я использую signalR для уведомления, т. е. когда запись вставляется в таблицу, я должен сообщить пользователю в своем приложении как новое уведомление. Мой код звучит примерно так:

I файл global.asax в Application_start():
SqlDependency.Start(@"data source=DESKTOP-591MN5Q\SQLEXPRESS01;initial catalog=Test_test;integrated security=True;");


Мой класс обслуживания уведомление ::

public static class Notification
 {
     static readonly string connString = @"data source=DESKTOP-591MN5Q\SQLEXPRESS01;initial catalog=Test_test;integrated security=True;";
     internal static SqlCommand command = null;
     internal static SqlDependency dependency = null;

     public static string GetNotification()
     {
         try
         {

             var messages = new List<tblNotification>();
             using (var connection = new SqlConnection(connString))
             {
                 connection.Open();
                 using (command = new SqlCommand(@"SELECT [NotificationId],[UserId],[IsSeen],[Message],[CreatedDate],[ActionID] FROM [dbo].[tblNotification]", connection))
                 {
                     command.Notification = null;

                     if (dependency == null)
                     {
                         dependency = new SqlDependency(command);
                         dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
                     }

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

                     var reader = command.ExecuteReader();

                     while (reader.Read())
                     {
                         messages.Add(item: new tblNotification
                         {
                             NotificationId = (int)reader["NotificationId"],
                             UserId = (int)reader["UserId"],
                             IsSeen = (bool)reader["IsSeen"],
                             Message = reader["Message"] != DBNull.Value ? (string)reader["Message"] : "",
                             CreatedDate = (DateTime)reader["CreatedDate"],
                             ActionID = (int)reader["ActionID"]
                         });
                     }
                 }
             }
             var jsonSerialiser = new JavaScriptSerializer();
             var json = jsonSerialiser.Serialize(messages);
             return json;

         }
         catch (Exception ex)
         {

             return null;
         }
     }

     private static void dependency_OnChange(object sender, SqlNotificationEventArgs e)
     {
         if (dependency != null)
         {
             dependency.OnChange -= dependency_OnChange;
             dependency = null;
         }
         if (e.Type == SqlNotificationType.Change)
         {
             MyHub.Send();
         }
     }
 }



Я понял, что при загрузке страницы будет вызван метод GetNotification (), который зарегистрирует метод dependency_OnChange() таким образом, что если какие-либо изменения будут сделаны в tblNotification, то dependency_OnChange() будет вызван.

Я выполнил приведенный ниже скрипт, чтобы включить отслеживание изменений:

ALTER DATABASE [Test_test]
	SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE;



Но все же мой код не может вызвать метод dependency_OnChange() при вставке записи в таблицу.

Что я уже пробовал:

При первом выполнении метода GetNotification() команда.Уведомление = null. зависимость будет инициализирована. После выполнения строки var reader = command.ExecuteReader();, команда.Уведомление получит значение .

1 Ответов

Рейтинг:
2

Codes DeCodes

Я нашел решение. На всякий случай, если это решение поможет кому-то еще в будущем.

Владельца БД не существовало, поэтому эта проблема была вызвана. Я сменил владельца БД, и теперь все работает так, как требуется.


Jaime Stuardo - Chile

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

Codes DeCodes

Джейми, два изменения исправили мою проблему:
1: Выполните приведенный ниже скрипт, чтобы включить отслеживание изменений в sql. Это позволит настроить вашу БД немедленно уведомлять об изменениях в таблицах:
ALTER DATABASE [Test_test]
УСТАНОВИТЕ ENABLE_BROKER С НЕМЕДЛЕННЫМ ОТКАТОМ;

2: в sql Security -> Logins убедитесь, что существует пользователь, с помощью учетных данных которого вы входите в БД из приложения. И убедитесь, что этот пользователь имеет полное разрешение на чтение/запись