Andy Lanng Ответов: 1

Как реализовать sqldependency с помощью linqtosql?


Привет ^_^

Я хочу посмотреть таблицу конфигурации для любых изменений. Эта таблица по существу содержит пользовательские настройки, которые могут быть переопределены администратором. Если какая-то функциональность или доступ отключены, то мне нужно предупредить клиентскую сторону (используя веб-сокеты).

Проблема в том, что приложение администратора и клиентское приложение не находятся в одном решении.

Мой коллега хочет опросить мою БД (он любит свои опросы >_ & lt;), но я бы предпочел что-то более элегантное.

Конфигурации не будут меняться очень часто.

Итак, вот что у меня есть в моем контексте Ctor:


public Context() // custom Context ctor.
            : base(ConfigurationManager.ConnectionStrings["ebrokerAccess"].ConnectionString)
  {
    SqlDependency.Stop(ConfigurationManager.ConnectionStrings["ebrokerAccess"].ConnectionString);
    SqlDependency.Start(ConfigurationManager.ConnectionStrings["ebrokerAccess"].ConnectionString);

     SqlDependency dep = new SqlDependency((SqlCommand) GetCommand(Configurations.AsQueryable()));

    dep.OnChange += (sender, args) =>
    {
      ConfigurationView.Changed(sender, args);
    };

  }


У меня работает агент сервера, и я включил брокера в базе данных, но когда я изменяю значение БД через MSSqlMS, события не срабатывают.

Неужели я совершенно неправильно понял это употребление?

Любые подсказки были бы полезны ^_^
Спасибо
Энди

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

Я надеялся использовать L2S на [prop]Changing / Changed events, но я понял, что это просто методы PropertyChanged в экземпляре контекста.

1 Ответов

Рейтинг:
7

Richard Deeming

Похоже, вы упускаете жизненно важный шаг:


5. выполните команду, используя любой из Execute методы проведения SqlCommand объект. Поскольку команда привязана к объекту уведомления, сервер распознает, что он должен сгенерировать уведомление, и информация о очереди будет указывать на очередь зависимостей.

Другими словами, уведомление не регистрируется до тех пор, пока не будет выполнена соответствующая команда. Поскольку вы никогда не выполняете команду, уведомление не регистрируется, и событие изменения никогда не вызывается.
using (SqlCommand command = (SqlCommand)GetCommand(Configurations.AsQueryable()))
{
    SqlDependency dep = new SqlDependency(command);
    
    dep.OnChange += (sender, args) =>
    {
      ConfigurationView.Changed(sender, args);
    };
    
    using (SqlDataReader reader = command.ExecuteReader())
    {
        // You might need to read the rows here; the documentation isn't clear.
    }
}


Andy Lanng

А! Теперь это кажется таким простым #^_^#