C# Отслеживание изменений данных в таблице MSSQL

460
30 августа 2017, 13:37

Как организовать уведомление программы о том, что определенные данные в базе поменялись? Желательно, чтобы в случае изменения данных в базе запускалась хранимая процедура, возвращающая данные в программу. Есть ли предусмотренные стандартные классы для этого? Вручную не хочется опрашивать.

Answer 1

Можно использовать класс SqlDependency.

1) Необходимо убедиться, что для целевой БД включен Service Broker

SELECT is_broker_enabled FROM sys.databases WHERE name = 'Database_name';

2) Если Service Broker не включен, то нужно включить его. При этом не должно быть активных соединений с БД

ALTER DATABASE [Database_name] SET ENABLE_BROKER;

3) Пример C# приложения с MSDN

void Initialization()
{
    // Create a dependency connection.
    SqlDependency.Start(connectionString, queueName);
}
void SomeMethod()
{
    // Assume connection is an open SqlConnection.
    // Create a new SqlCommand object.
    using (SqlCommand command=new SqlCommand(
        "SELECT ShipperID, CompanyName, Phone FROM dbo.Shippers", 
        connection))
    {
        // Create a dependency and associate it with the SqlCommand.
        SqlDependency dependency=new SqlDependency(command);
        // Maintain the refence in a class member.
        // Subscribe to the SqlDependency event.
        dependency.OnChange+=new
           OnChangeEventHandler(OnDependencyChange);
        // Execute the command.
        using (SqlDataReader reader = command.ExecuteReader())
        {
            // Process the DataReader.
        }
    }
}
// Handler method
void OnDependencyChange(object sender, 
   SqlNotificationEventArgs e )
{
  // Handle the event (for example, invalidate this cache entry).
}
void Termination()
{
    // Release the dependency.
    SqlDependency.Stop(connectionString, queueName);
}

В объекте SqlCommand после ключевого слова select в запросе перечислены поля таблиц БД, изменения значений которых необходимо отслеживать. Также важно, чтобы была явно указана схема (по умолчанию dbo).

При возникновении события вызывается метод OnDependencyChange.

READ ALSO
C# скриншот окна

C# скриншот окна

Здравствуйте, недавно я задал вопросНо ответа на него так ине последовало, решил пойти по другому пути, сделать скриншот окна и от туда вырезать...

543
Inline Keyboard Callback Button dynamic

Inline Keyboard Callback Button dynamic

Работаю с Telegrambot

721
Главный поток в Unity

Главный поток в Unity

Существует такой код (упрощенный):

367
Автозагрузка программы WPF не работает

Автозагрузка программы WPF не работает

Не работает функция автозагрузки программыСтрока добавляется в регистр, но после включения системы не запускается

422