Обнаружение изменений базы данных SQL

Рассмотрим этот пример:

INSERT INTO [Table] (column1)
SELECT value1

Если бы я выполнил эту команду в SSMS, в отношении приложения форм С#, что мне нужно было бы сделать, чтобы распознать это событие? Что-то столь же простое, как приложение, отображающее MessageBox при возникновении этого события. Я просто не могу разобраться с этим или найти какие-либо полезные данные о нем. Я пытался использовать SqlDependency, но мне не повезло. Если это путь, по которому мне нужно идти, может ли кто-нибудь помочь мне немного лучше понять концепцию?


person Volearix    schedule 04.09.2014    source источник
comment
если я вас понимаю, вы хотите инициировать событие в своем приложении С#, когда ваш сервер sql запускает выбор вставки?   -  person crthompson    schedule 04.09.2014
comment
@paqogomez Верно! Вроде как триггер в ssms, хочу триггер в C#   -  person Volearix    schedule 04.09.2014
comment
Вы хотите определить, когда что-то изменяется в базе данных из приложения C#? SQL Server не отправляет уведомления, поэтому вам придется что-то опрашивать. Одна вещь, которую вы можете сделать, это добавить INSERT TRIGGER там, где это необходимо, который ведет журнал в таблицу аудита и SELECT из нее.   -  person Zer0    schedule 04.09.2014
comment
SQL Server поддерживает создание триггеров на основе CLR. Это означает, что вы можете запускать код C#, когда что-то вставлено. Я бы порекомендовал вам использовать это и заставить триггер каким-то образом отправлять событие в приложение.   -  person Dark Falcon    schedule 04.09.2014
comment
Когда что-то меняется (обновляется) или когда что-то вставляется? Что произошло, когда вы попробовали SQLDependency?   -  person Paul Zahra    schedule 04.09.2014
comment
@PaulZahra В первую очередь Insert, но я был бы счастлив просто запустить триггер в этот момент.   -  person Volearix    schedule 04.09.2014


Ответы (1)


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

Вот хороший "учебник/пример", который работает и запускает вас через основы.

Вот хороший обзор уведомлений о запросах.

  • Низкоуровневая реализация предоставляется классом SqlNotificationRequest, который предоставляет функциональные возможности на стороне сервера, позволяя выполнять команду с запросом уведомления.

  • Высокоуровневая реализация обеспечивается классом SqlDependency, который представляет собой класс, обеспечивающий высокоуровневую абстракцию функций уведомления между исходным приложением и SQL Server, что позволяет использовать зависимость для обнаружения изменений на сервере. В большинстве случаев это самый простой и эффективный способ использовать возможности уведомлений SQL Server для управляемых клиентских приложений с помощью поставщика данных .NET Framework для SQL Server.

  • Кроме того, веб-приложения, созданные с использованием ASP.NET 2.0 или более поздней версии, могут использовать вспомогательные классы SqlCacheDependency.

Это так же просто, как «Объект SqlDependency может быть связан с SqlCommand, чтобы определять, когда результаты запроса отличаются от первоначально полученных».

Сначала необходимо включить уведомления о запросах и следовать Создание запроса для уведомления

void Initialization()
{
    // Create a dependency connection.
    SqlDependency.Start(connectionString, queueName);
}

void SomeMethod()
{
    // Assume connection is an open SqlConnection.
    // Create a new SqlCommand object which directly references (no synonyms) the data you want to check for changes.
    using (SqlCommand command=new SqlCommand("SELECT value1 FROM [Table]", 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);
}
person Paul Zahra    schedule 04.09.2014
comment
это не дает мне вставленную строку - person Amey P Naik; 02.03.2018
comment
Попробуйте что-то вроде этого: stackoverflow.com/questions/28401057/ - person Paul Zahra; 03.01.2019
comment
Или что-то вроде этого оригинального «слушателя брокера услуг» github.com/dyatchenko/ServiceBrokerListener. - person Paul Zahra; 03.01.2019