Есть ли что-то вроде FileSystemWatcher для таблиц сервера Sql? - PullRequest
4 голосов
/ 21 августа 2009

Мне бы хотелось, чтобы моя служба Windows (записываемая в .NET) распознавала, когда новые строки добавляются в конкретную таблицу, но вместо извлечения данных из sql-сервера я бы хотела использовать модель push-сервера.

есть ли у меня подсказка, как этого добиться? я использую sql server 2005.

ТИА

Ответы [ 5 ]

12 голосов
/ 21 августа 2009

Существует также механизм ADO.NET SqlDependency , если вы используете клиентскую ADO.NET с C # или VB.NET

Объект SqlDependency может быть связанный с SqlCommand в порядке определить, когда результаты запроса отличаются из тех, которые первоначально получены. Вы также может назначить делегата Событие OnChange, которое сработает, когда результаты меняются для ассоциированного команда. Вы должны связать SqlDependency с командой перед Вы выполняете команду. HasChanges свойство объекта SqlDependency также можно использовать для определить, есть ли у результатов запроса изменилось, так как данные были первыми получен.

Вы в основном связываете SqlDependency с вашим SqlCommand и предоставляете обработчик событий, который вызывается при изменении значений, составляющих набор результатов этого SqlDependency.

using(SqlCommand cmd = new SqlCommand(queryStatement, _conn))
{ 
   cmd.Notification = null;

   SqlDependency dependency = new SqlDependency(cmd);

   dependency.OnChange += 
       new OnChangeEventHandler(OnChange);

    ......
}

В обработчике событий вы можете делать то, что вам нужно.

void OnChange(object sender, SqlNotificationEventArgs e)
{
  SqlDependency dependency = sender as SqlDependency;

  (do whatever you need to do - e.g. reload the data)

}

Марк

3 голосов
/ 21 августа 2009

Самое близкое, что вы получите в Sql Server 2005 - это триггер. Sql Server 2008 также имеет сбор данных изменений.

1 голос
/ 21 августа 2009
0 голосов
/ 26 января 2015

Будьте осторожны, используя SqlDependency класс для отслеживания изменений в таблицах базы данных - у него проблемы с утечками памяти. Однако вы можете использовать свою собственную реализацию с триггерами DDL и API SQL Service Broker или использовать один из проектов с открытым исходным кодом, например, SqlDependencyEx

int changesReceived = 0;
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
          TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) 
{
    sqlDependency.TableChanged += (o, e) => changesReceived++;
    sqlDependency.Start();

    // Make table changes.
    MakeTableInsertDeleteChanges(changesCount);

    // Wait a little bit to receive all changes.
    Thread.Sleep(1000);
}

Assert.AreEqual(changesCount, changesReceived);

Надеюсь, это поможет.

0 голосов
/ 21 августа 2009

Вы можете использовать триггер с вызовом веб-службы из базы данных. Но я понятия не имею, как плохо (если таковые имеются) влияние будет на базу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...