myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Datentechnologien » Überwachen von einer SQL Server Datenbanktablle
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Überwachen von einer SQL Server Datenbanktablle

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
RayYago RayYago ist männlich
myCSharp.de-Mitglied

Dabei seit: 22.07.2019
Beiträge: 12


RayYago ist offline

Überwachen von einer SQL Server Datenbanktablle

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

verwendetes Datenbanksystem: SQL Server + SSMS Tools

Hallo,

ich hatte eine ähnliche Frage bereits im Smalltalk gestellt, habe jetzt aber eine Spezifische Frage dazu:

Was wäre eine gute Möglichkeit, aus einem C# Dienst heraus eine SQL Server Tabelle zu überwachen?

Die Situation ist folgende:

Es gibt eine SQL Server Tabelle die nur ein paar Spalten beinhaltet. Dort werden Einträge abgestellt wann z.B. ein Vorgang komplett verpackt wurde. Sobald dieser Eintrag in der Datenbank erscheint, muss Sekunden später ein Lieferschein gedruckt werden. Es kann mehrere Einträge die Minute geben.

Nun möchte ich jeden neuen Eintrag gerne mitbekommen. Die Tabelle hat ein Verarbeitungsstatus, mit dem ich Abfragen kann, welche Einträge ich bereits abgearbeitet habe und welche offen sind.

Diese Eintrage möchte ich abfragen und dann dafür halt in der C# Anwendung (ich wollte ein Dienst dafür erstellen), die Daten weiter verarbeiten.

Ich Scrolle schon ein wenig durch das Web und die häufigsten Methoden scheinen zu sein:

- SqlDependency
- long polling

in vielen Artikeln habe User nur schlechtes über SqlDependency geposted, das Einträge häufig nicht erkannt werden etc.

Hat jemand Erfahrung damit?

Eine andere möglichkeit dachte ich mir, wäre vielleicht eine C# http Schnittstelle zu bauen und im SQL Server einen Tabellen Trigger zu verwenden, der für jeden Eintrag ein http Request schickt. Aber auch hier sagen die meisten "der SQL Server ist nicht dafür gemacht"

Kann mir jemand einen Tipp geben oder vielleicht Erfahrungen mitteilen. Ich soll den Aufwand abschätzen, bin mir aber nicht einmal sicher, wie ich genau vorgehen soll...

Danke im voraus!
07.11.2019 12:11 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ThomasE. ThomasE. ist männlich
myCSharp.de-Mitglied

avatar-178.gif


Dabei seit: 26.11.2013
Beiträge: 444
Entwicklungsumgebung: Visual Studio 2015Pro/2017Ent


ThomasE. ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von RayYago:
Dort werden Einträge abgestellt wann z.B. ein Vorgang komplett verpackt wurde. Sobald dieser Eintrag in der Datenbank erscheint, muss Sekunden später ein Lieferschein gedruckt werden. Es kann mehrere Einträge die Minute geben.

Ist nicht schon der Ansatz verkehrt?

Wieso werden die Lieferscheine nicht schon vom vorherigen System erstellt bzw. gibt es da keine Schnittstelle dazu, zu dem System?
07.11.2019 13:23 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Khalid Khalid ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2534.gif


Dabei seit: 19.07.2005
Beiträge: 3.503
Entwicklungsumgebung: Visual Studio 15/17
Herkunft: Hannover


Khalid ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Moin,

auch wenn ich ThomasE. zustimme, dass solch Notifications eigentlich in den Service selber gehören, kann man solche Fälle lösen, wenn man z.B. eine Message Queue verwendet:  MSMQ and SQL Server Integration


Gruß
Khalid
07.11.2019 13:35 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
RayYago RayYago ist männlich
myCSharp.de-Mitglied

Dabei seit: 22.07.2019
Beiträge: 12

Themenstarter Thema begonnen von RayYago

RayYago ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Es können keine korrekten Lieferscheine erstellt werden, das ganze System ist etwas älter und bietet keine Möglichkeit dafür. Zudem müssen die Lieferscheine aktuell sein, es kann sein das Ware verpackt wird aber nicht auf den LKW kommt. Im Post oben etwas falscher erklärt, der Lieferschein soll nur das beinhalten was wirklich auf dem LKW landet und das kann das eigentliche System momentan nicht. Deswegen der Umweg.

Aber das ist auch garnicht das Problem, das soll eine Übergangslösung werden bis das neue ERP System nächstes Jahr kommt.

Die variante mit MSMQ scheint mir relativ schwirig da man Einstellungen ander SQL Server Datenbank vornemmen muss, was mir leider nicht möglich ist.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von RayYago am 07.11.2019 15:18.

07.11.2019 15:04 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
inflames2k inflames2k ist männlich
myCSharp.de-Poweruser/ Experte

avatar-3407.gif


Dabei seit: 03.01.2010
Beiträge: 2.220
Entwicklungsumgebung: Visual Studio 2010 Express


inflames2k ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wenn es nicht anders lösbar ist solltest du in der Datenbanktabelle eine "Status"-Spalte erngänzen.

Diese hat dann je nach dem wie der Verarbeitungsstatus ist einen anderen Wert(Standard wäre m.E 0 -nicht verarbeitet, 1 - erfolgreich verarbeitet, x - fehlgeschlagen).

Bei Eintragung in die Tabelle wird der Wert "0" voreingetragen. - Der Dienst ruft nun zyklisch alle im Status 0 ab, druckt den / die Lieferscheine und setzt den neuen Status (1 für erfolgreiche Drucks, x für Fehler).

Auf die Weise hast du später die Möglichkeit fehlgeschlagene Drucke durch Ändern des Status noch einmal ausführen zu lassen.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von inflames2k am 07.11.2019 16:34.

07.11.2019 16:33 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
FZelle
myCSharp.de-Poweruser/ Experte

Dabei seit: 23.04.2004
Beiträge: 9.813


FZelle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich habe in einem alten Projekt mit SqlDependency gearbeitet und da gab es nur bei den Kunden Probleme die ein unstabiles Netzwerk hatten.

Ich habe mich damit beholfen "gelegentlich" zu schauen ob die noch im Server registriert sind und ggf wieder neu erstellt.

Was die meisten falsch machen ist, die Sql Abfrage die man da benutzt, darf kein * beinhalten, und muss nach jedem auslösen neu erstellt werden.
07.11.2019 20:18 Beiträge des Benutzers | zu Buddylist hinzufügen
RayYago RayYago ist männlich
myCSharp.de-Mitglied

Dabei seit: 22.07.2019
Beiträge: 12

Themenstarter Thema begonnen von RayYago

RayYago ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@FZelle Danke erstmal für dein Erfahrungsbericht. Ich hätte da mal eine Frage wie du SQLDependency verwendet hast. Ich forsche gerade nach und probiere viel mit Testprojekten.

Ich sehe in manchen Projekten folgendes:

C#-Code:
await this.sampleSqlCommand.ExecuteReaderAsync(CommandBehavior.CloseConnection);

und in anderen

C#-Code:
using (SqlDataReader reader = command.ExecuteReader())
    //        {
    //            // Process the DataReader.
    //        }

Manche machen es Asyn und andere nicht. Macht es sind Aync zu benutzen, wenn man nur eine Tabelle überwachen möchte? Oder wäre Async in jedem Fall besser da dann mehr Datensätze abgearbeitet werden könne?
07.11.2019 22:35 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.172
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Async macht immer Sinn, sobald I/O im Spiel ist.
Neue APIs/SDK bieten oft auch nur noch asynchrone Wege an - was auch gut so ist.
07.11.2019 22:59 Beiträge des Benutzers | zu Buddylist hinzufügen
FZelle
myCSharp.de-Poweruser/ Experte

Dabei seit: 23.04.2004
Beiträge: 9.813


FZelle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Die Async Schlüsselwörter und damit auch die Funktionen im FW gibt es noch nicht so lange ( das pattern schon ),
so das du natürlich viel mehr Beispiele findest zur "alten" Herangehensweise.

Du musst nur verstehen das dieses Command nie Daten liefert, sondern lediglich dafür da ist die Anfrage an den Server zu stellen,
und man ja "irgendwann" benachrichtigt wird das diese Abfrage neue Daten geliefert hätte,
dann ist doch klar das sie in einem extra Task/Thread ablaufen muss.

Und seit wir Tasks haben ist das die deutlich resourceschonendere Variante.

Nur bei der Variante ohne async await, vergessen viele Leute das Command.Cancel was zu resourceproblemen führt.

Auch solltest Du, solange wie Du nicht wirklich fest bist in den Grundlagen, nicht irgendwelche Codes im Internet anschauen.
Da gibt es haufenweise Schrott.
Schau Dir an, wie es diejenigen die es designed haben tun.

Wenn ich mir manche Grundlagenbücher und vor allem Grundlagenvideos auf YT anschaue, dann schaudert es mich.

Viele gehen nach dem Motto vor, wir frickeln jetzt am Anfang, aber wir werden es später richten, nur nichts ist so beständig in der SW-Entwicklung wie das Provisorium.

Ich habe z.b. lange mit Buchautoren gestritten, das sie bitte niemals niemals niemals Parameter in SqlStrings frickeln sollen, nicht mal für das kleinste Beispiel, denn das was Du als erstes lernst bleibt am längsten hängen.
Und dann schau dir diese Teile mal in den Einsteigerbüchern an.

Also schau dir bitte erst die Grundlagen bei MS an, oder dem jeweiligen "Erfinder" von etwas, und wenn du es verstanden hast, dann, und erst dann, schaue Dir an, was andere daraus gemacht haben.
08.11.2019 00:07 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 15.11.2019 03:36