C # / SQL-Listener, um mir mitzuteilen, ob eine Zeile in eine Tabelle eingefügt wurde

8

Kann jemand Beispielcode posten oder mir mitteilen, wie ich einen Listener einrichten soll, um mich zu benachrichtigen (ein Ereignis auszulösen), wenn eine neue Zeile in eine SQL Server-Datenbank eingefügt wird?

Ich möchte keinen der Messaging- oder Broker-Dienste von SQL Server verwenden. Ich habe derzeit einen Datei-Listener, der mich benachrichtigt, wenn neue Zeilen an eine flache Datei angehängt werden. Ich möchte das Gleiche für eine Datenbanktabelle tun.

    
greg 15.06.2011, 22:09
quelle

7 Antworten

8

Suchen Sie vielleicht nach der Klasse SqlDependency , die dies zulässt Ihr Coderegister wird benachrichtigt, wenn Änderungen auftreten?

  

SqlDependency eignet sich ideal für Caching-Szenarien, in denen Ihre ASP.NET-Anwendung oder der Dienst der mittleren Schicht bestimmte Informationen im Speicher zwischenspeichern müssen. Mit SqlDependency können Sie Benachrichtigungen erhalten, wenn sich die ursprünglichen Daten in der Datenbank ändern, sodass der Cache aktualisiert werden kann.

Oder fällt dies in den Bereich der Dinge, die Sie nicht zulassen, ist es nicht ganz klar?

    
Damien_The_Unbeliever 16.06.2011 06:53
quelle
2

Sie müssten beim Einlegen oder Abfragen der Datenbank eine Art Datenbank-Trigger ausführen, um nach neuen Datensätzen zu suchen. Ich empfehle den letzteren Vorschlag nicht, da dies sehr leistungsintensiv sein kann.

Abgesehen davon geben Sie uns nicht viel weiter. Welche Version von SQL Server verwenden Sie? Was hast du schon probiert? Auf welche Probleme sind Sie gestoßen?

Hier sind ein paar Links, die Sie in die richtige Richtung weisen könnten:

Explore SQL Server-Trigger

Vorgehensweise: Erstellen und Ausführen eines CLR SQL Server-Triggers

Eine ähnliche Frage, die einen alternativen (besseren?) Weg vorschlägt: Können SQL CLR-Trigger dies tun? Oder gibt es einen besseren Weg?

    
Kyle Trauberman 15.06.2011 22:15
quelle
1

Sie können dazu SQL-Benachrichtigungen verwenden, aber Sie haben gesagt, dass Sie den Broker nicht verwenden möchten. Andernfalls können Sie abfragen, aber wie erwähnt, kann dies zu Leistungsproblemen führen.

Eine andere Möglichkeit besteht darin, Trigger in der Datenbanktabelle zu verwenden, um eine Datei im Dateisystem zu berühren.

%Vor%

Verwenden Sie dann einen FileSystemWatcher , wie Sie bereits erwähnt haben, dass Sie bereits in Ihrem tun Anwendung, um eine Benachrichtigung zu erhalten, wenn sich die Datei ändert.

Es gibt Sicherheitsberechtigungen , die Sie verwenden werden müssen Ihrem Sql-Server-Benutzer gewähren, um das möglich zu machen, aber wenn das akzeptabel ist, dann funktioniert das, ohne den Vermittler zu benutzen.

    
Phill 15.06.2011 22:33
quelle
1

Ich empfehle auch Trigger, der irgendwo in db Einfügungen registriert (und Sie müssen die Datenbank sowieso abfragen, was nicht so teuer ist, wenn der Trigger eine spezielle Tabelle mit einer einzelnen Zeile modifiziert). Aber wenn Sie IDENTITY auf Ihrem Primärschlüssel haben, können Sie den Wert der aktuellen Identität der Tabelle überwachen:

%Vor%

Es ist ein Hack, aber es ist schnell und Sie müssen Ihre Datenbank nicht ändern (natürlich funktioniert es nur für Einfügeoperationen). Sie können jedoch Einfügungsoperationen überspringen, wenn der Identitätswert zwischen Umfragen explizit geändert wurde und genau auf den Wert gesetzt wurde, der zum Zeitpunkt des vorherigen Abfragens vorhanden war (was jedoch nicht sehr wahrscheinlich ist).

    
Nicolai Shestakov 16.06.2011 06:45
quelle
0

Ich würde CLR-Trigger in Betracht ziehen, Bitte lesen Sie die folgenden Artikel ...

Erstellen Sie Ihren ersten CLR-Trigger in SQL Server

CLR-Trigger

    
Behzad 17.06.2015 05:29
quelle
0

Gemäß "Damien" müssen Sie die sqldependency verwenden, um Änderungen zu erkennen.

Beispiel für sqldependency bei msdn: - Ссылка

    
PRathore 22.03.2017 16:31
quelle
-3

Trigger klingt am besten:

%Vor%     
kheya 16.06.2011 01:23
quelle

Tags und Links