NAS

C# Mit C# eine MySQL Datenbank auf Änderungen überwachen

Mathias09876

Ensign
Registriert
Nov. 2010
Beiträge
246
Hallo zusammen,

ich würde gerne eine MySQL Datenbank auf Änderungen überwachen um diese dann gegeben Falls zu verabreiten.
Gibt es da etwas ähnliches wie Beispielsweise das FileSystemWatcher Objekt?
Wo ich dann einfach ein nettes Handle hinzufüge, das bei bedarf ausgeführt wird?

Hoffe Ihr könnt mir helfen :)

Grüße
 
Was soll denn der Unsinn?

Dazu hast du doch das DBMS was für dich Überwachungen macht und ggf. kannst du dir Trigger schreiben. Da mit nem externen Framework ranzugehen wäre schon sehr eigenartig.
 
Naja der Unsinn hat ganz einfache Gründe:

Ich habe ein C# Programm, schreibe damit in eine MySQL Datenbank und lese auch wieder daraus. Allerdings soll das auslesen erst dann passieren, wenn eine andere Anwendung (in dem Fall nur eine andere Instanz des Programms) was neues rein geschrieben hat.
Ich dachte mir alle 10 Sekunden pollen ob sich der Inhalt verändert hat ist nicht ganz so schön.
Da ich wo gelesen habe, dass es für SQL Datenbanken in C# ein OnChange Event gibt dachte ich mir so etwas gibt es evtl. auch für MySQL.
Da ich mich nicht sonderlich gut mit Datenbanken auskenne, leider aber auch nicht ohne auskomme die evtl. vom Inhalt etwas unsinnige Frage.

Gruß
 
Dann solltest du dich mal mit Datenbanken auseiander setzen wenn du damit Arbeitest.

Deshalb würd ich deine Architektur etwas anders aufbauen.
Wenn du sagst das du zwei Instanzen deiner Programme hast, warum lässt du die beiden nicht miteiander Kommunizieren. Als die Datenbank dafür als Geisel zu nehmen :p

Du kannst mal nach "Named Pipes" suchen, diese brauchst du um untereiander zu kommunzieren.
 
Es wäre noch zu klären, ob mit "andere Instanz" eine Instanz auf der selben Maschine oder eine entfernte Instanz gemeint ist.
 
Ja deshalb die Frage hier, sie war teil meiner Auseinandersetzung ^^

Auf Named Pipes habe ich verzichtet, da später einmal auch ein kleines php Skript o.ä. an die Informationen kommen sollte, um sie online zugänglich zu machen.
Ich denke da ist eine Datenbank der beste Weg oder?
Hätte es jetzt nicht so schön gefunden alles in einem Xml Datei zu schreiben (diese könnte ich mit Hilfe des FileSystemWatchers beobachten)

Zur Instanzen Frage:
Die Instanz läuft im selben Netzwerk aber auf einer anderen Maschiene.
 
Also ich finde es nicht zwingend unschön, wenn man die Datenbank direkt dafür benutzt. Ein Trigger kann in MySQL extern mit dem Betriebssystem kommunizieren und Programme starten, und zwar ohne Gefrickel.
Der Trigger kann desweiteren ganz genau festlegen, wann er eine Meldung herausgeben soll. Damit sind die Spezialfälle alle schon erschlagen, die man sonst umständlich lösen müsste.


http://forge.mysql.com/projects/project.php?id=211
 
Hmm das ist natürlich doof dann.

Ich glaube dann wird dir nichts weiter übrig bleiben als zu pollen. Ich weiß nich inwieweit es das MySQL DBMS hinbekommt jemanden von "extern" zu informieren.

Edit:
@carom: Na das ist doch mal nen Wort :D
 
carom schrieb:
Ein Trigger kann in MySQL extern mit dem Betriebssystem kommunizieren und Programme starten, und zwar ohne Gefrickel, das hat man bei der Programmierung von MySQL so gewollt.
[...]

http://forge.mysql.com/projects/project.php?id=211

aber auch nur mit dieser Third-Party UDF, die nicht Bestandteil von MySQL ist und direkt in MySQL einkompiliert werden muss.


@Darkfirefighter: Für solche vorhaben hat man Publish/Subscribe erfunden, auf welcher Basis du das umsetzt, bleibt dir überlassen, die Datenbank kann es jedenfalls nicht und ist auch nicht die richtige Softwarekomponente dafür.
 
carom schrieb:
Also ich finde es nicht zwingend unschön, wenn man die Datenbank direkt dafür benutzt. Ein Trigger kann in MySQL extern mit dem Betriebssystem kommunizieren und Programme starten, und zwar ohne Gefrickel.
Der Trigger kann desweiteren ganz genau festlegen, wann er eine Meldung herausgeben soll. Damit sind die Spezialfälle alle schon erschlagen, die man sonst umständlich lösen müsste.


http://forge.mysql.com/projects/project.php?id=211

ice-breaker schrieb:
aber auch nur mit dieser Third-Party UDF, die nicht Bestandteil von MySQL ist und direkt in MySQL einkompiliert werden muss.


@Darkfirefighter: Für solche vorhaben hat man Publish/Subscribe erfunden, auf welcher Basis du das umsetzt, bleibt dir überlassen, die Datenbank kann es jedenfalls nicht und ist auch nicht die richtige Softwarekomponente dafür.

Das wiederum is schade :)

Dann muss er wohl doch pollen.
 
Hmm ok, sehe schon das ist doch nicht so einfach, wie ich mir das vorgestellt habe... Schade ^^

Dann werde ich vermutlich die Kommunikation zwischen den Programmen über ein XML File machen (oder gehen Named Pipes auch durchs Netzwerk? - Das muss ich erst mal noch recherchieren) und auf die Datenbank nur ganz gezielt zugreifen, wenn jemand die Daten online sehen will.
Ist vielleicht nicht die schönste Lösung aber die, die ich mit dem wenigsten Aufwand ans laufen bekomme.

Danke für Eure Hilfe!

Grüße
 
ice-breaker schrieb:
aber auch nur mit dieser Third-Party UDF, die nicht Bestandteil von MySQL ist und direkt in MySQL einkompiliert werden muss.


Das stimmt, diese ist aber immerhin in der offiziellen Trigger-FAQ unter "Can triggers call an external application through a UDF?" erwähnt.

Ich bin bei dieser Frage unschlüssig, ob es wirklich verwerflich ist, die Datenbank dafür zu missbrauchen. Wenn man sich z.B. externe Notification-Tools anschaut, welche über Trigger an die DB angebunden werden, dann ist das auch vergleichbar. Sicherlich sind Trigger aber eher für intra-DB Operationen vorgesehen.

Da man aber so oder so noch irgend eine extra Serveranwendung benötigt (da auf Polling verzichtet werden soll, irgendwie müssen die Clients ja benachrichtigt werden), bringt es wohl doch keine Aufwandsersparnis.
 
Wozu brauchst du PHP? Wenn du schon in C# machst dann benutze doch auch die WebServices in C# Du kannst sowohl Windows als auch Webanwendungen mit WebServices regeln.

Die Überwachung der Daten finde ich unüberlegt mit nen externen Programm diese noch auszulesen und dann nochmal zu schreiben! Trigger wäre schöner, wenn man noch CMD befehle ausführen will, kommt man nicht ohne die Adminrechte weiter.
 
Zurück
Oben