2009-08-21 2 views
4

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

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

ТИА

ответ

12

Там также механизм 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) 

} 

Marc

+0

Это отличное решение и очень хорошо может быть лучшим в вашей ситуации, однако я уверен, что «Сервер» (SQL-сервер) не «нажимает» что-нибудь ... Мне любопытно, однако, что * * происходит под обложками? –

+1

@Mike: сервер ** - ** нажимающий. См. Здесь: http://rusanu.com/2006/06/17/the-mysterious-notification/ –

+2

@Marc: на самом деле уведомления о запросах доступны также клиентам ODBC и OleDB: http://msdn.microsoft.com/ru -us/library/ms130764.aspx –

3

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

1
+0

Учитывая, что службы Notification Services были быстро сброшены для версии 2008 года, я бы не рекомендовал новое решение на основе этого. Как размещено marc_s, классы SqlDependency/SqlNotificationRequest могут использоваться из управляемого кода. –

+0

Я не знал, что он был сброшен. Не похоже, что я коснулся его через пару лет. Однако OP явно заявляет, что использует SQL Server 2005, поэтому это не будет проблемой.Тем не менее, вы правы в том, что идея marc_s является лучшей. Кажется, гораздо лучше не делиться ответственностью с внешней службой. –

0

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

0

Будьте осторожны с классом SqlDependency, чтобы отслеживать изменения в таблицах базы данных - он имеет problems с утечками памяти. Однако вы можете использовать свою собственную реализацию с триггерами DDL и SQL Service Broker API или использовать один из проектов с открытым исходным кодом, например. 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); 

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

Смежные вопросы