Есть ли что-то вроде FileSystemWatcher для таблиц сервера Sql?

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

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

ТИА

Ответы на вопрос(5)

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

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

 Leahn Novash21 авг. 2009 г., 16:18
Я не'Я не знаю, что это упало. Это не так, как я коснулся этого через пару лет. Тем не менее, OP явно заявляет, что он использует SQL Server 2005, поэтому это не будет проблемой. Тем не менее, вы правы в том, что идея marc_s лучше. Кажется, гораздо лучше не делить ответственность с внешним сервисом.
 Damien_The_Unbeliever21 авг. 2009 г., 15:32
Учитывая, что Notification Services были быстро отброшены для версии 2008 года, я 'не рекомендую новое решение, основанное на этом. Как написано в marc_s, классы SqlDependency / SqlNotificationRequest могут использоваться из управляемого кода.
Решение Вопроса

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)

}

Марк

 Remus Rusanu21 авг. 2009 г., 17:02
@Marc: на самом деле уведомления о запросах доступны также для клиентов ODBC и OleDB:msdn.microsoft.com/en-us/library/ms130764.aspx
 Mike DeFehr21 авг. 2009 г., 16:35
Это отличное решение, и вполне может быть лучшим в вашей ситуации, однако яЯ уверен, что "Сервер» (SQL-сервер) не "Нажатие» что угодно ... яМне любопытно, чтоявляется происходит под одеялом?
 Remus Rusanu21 авг. 2009 г., 16:55
@Mike: серверявляется толкания. Посмотреть здесь:rusanu.com/2006/06/17/the-mysterious-notification
 marc_s21 авг. 2009 г., 22:36
@Remus: отличная статья о Sql Dependency! Могу ли я процитировать это в будущем? :-)

Будьте осторожны, используя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);

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

Ваш ответ на вопрос