Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Gesucht: Tutorials zum Thema Multi-Client App mit SQL Server back-end
diamond
myCSharp.de - Member



Dabei seit:
Beiträge: 38
Herkunft: Deutschland

Themenstarter:

Gesucht: Tutorials zum Thema Multi-Client App mit SQL Server back-end

beantworten | zitieren | melden

verwendetes Datenbanksystem: SQL Server 2005/2008

Hallo verehrte CSharp Gemeinde,

ich bin auf der Suche nach guten Tutorials (am besten Video), Multi-Client Application mit SQL Server. Vielleicht kann jemand von Euch was empfehlen?

Es sollten nach Möglichkeit Arbeiten von größeren Tieren sein (bspw. Microsoft), keine Hobby Programmierer. Evtl. gibt es sogar gewisse Technologien oder pattern, die in solchen Bereich üblich sind (wie z.B. MVP oder CAB).


Für Eure Tipps, vielen Dank im voraus!


Grüße...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von diamond am .
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

http://www.microsoft.com/germany/msdn/webcasts/finder/default.mspx
diamond
myCSharp.de - Member



Dabei seit:
Beiträge: 38
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

@JAck30lena

danke für deinen Link, die Seite ist mir bereit bekannt. Ich hätte gehofft, dass jemand einen besseren Vorschlag hat, noch bevor ich anfangen würde, dort alle Beträge durchzuwühlen.
private Nachricht | Beiträge des Benutzers
kleines_eichhoernchen
myCSharp.de - Member

Avatar #avatar-2079.jpg


Dabei seit:
Beiträge: 4055
Herkunft: Ursprünglich Vogtland, jetzt Much

beantworten | zitieren | melden

Microsoft bietet mit AdventureWorks eine fertige Test- und Beispiel-Applikation an.
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10083

beantworten | zitieren | melden

Was erwartest Du, bei den Ausgangsinformatiionen?

Das Themengebiet ist so gross, das es da keine einzelne Info drüber geben kann.

Wie sehen die Daten aus?
Werden die Daten ständig geändert?
Ist Offlinebetrieb nötig?
Datenaufkommen?
..........
private Nachricht | Beiträge des Benutzers
diamond
myCSharp.de - Member



Dabei seit:
Beiträge: 38
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Hallo FZelle,

ich selbst arbeite im Moment viel mit DataTable und TableAdaptern, wenn ich Daten aus der Datenbank holen und manipulieren will.

Die Daten in der DataTable sind offline im Speichert, wenn nun mehrere User auf einer Tabelle arbeiten, müsste man ständig die Änderungen synchronisieren, was ich etwas nervig finde. Tut man das nicht, kommt es ruck zuck zu einer Parallelitätsverletzung.

Jetzt könnte man sich natürlich irgend welche klevere Logik ausdenken, wie man bestimmte Zeilen der Tabelle sperrt oder ähnliches, so dass User A auf diesen Zeilen arbeiten kann und User B einen entsprechenden hinweis erhält. aber bis man hier eine Fehlerfreie Lösung hat, kann es lange dauern.

Deshalb hatte ich dieses Thema gestartet, in der Hoffnung, dass ich einfach zu kurz denke und es vermutlich schon länger ein kleveres Pattern hierfür gibt.
private Nachricht | Beiträge des Benutzers
Khalid
myCSharp.de - Experte

Avatar #avatar-2534.gif


Dabei seit:
Beiträge: 3627
Herkunft: Hannover

beantworten | zitieren | melden

Um hier eine wirklich saubere Lösung zu erhalten, müsste man einen Anwendungsserver aufsetzen, der die Kontrolle über die Daten übernimmt. Wenn also ein Benutzer einen Datensatz öffnet, wird dies im Anwendungsserver registriert. Versucht ein anderer den gleichen Datensatz zu öffnen, weis der Anwendungsserver das dieser bereits geöffnet ist und gibt einen entsprechenden Fehlercode zurück. Ebenfalls wird jeder geöffnete Datensatz mit einem Zeitstempel versehen. Wenn also ein Benutzer einen Datensatz öffnet und geht danach in die Mittagspause, wird der Datensatz vom AppServer nach einer gewissen Zeit entsperrt und an den Client eine Nachricht gesendet.

All dies lässt sich mit WCF relativ "einfach" umsetzen. Alle Clients arbeiten dann nur noch gegen den AppServer und nicht mehr gegen die Datenbank. Die Clients dürfen gar nicht wissen, das es eine Datenbank gibt. AppServer bieten eine ganze Reihe an Vorteile, gegenüber dem direkten arbeiten auf einer Datenbank.

Aber wie du bereits erkannt hast, kann es lange dauern bis man eine fehlerfreie Lösung hat. Aber der Aufwand lohnt sich meistens, gerade bei größeren Projekten, bzw. bei einer großen Anzahl von Clients.
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
private Nachricht | Beiträge des Benutzers
diamond
myCSharp.de - Member



Dabei seit:
Beiträge: 38
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Hallo Khalid,

das hört sich gut an. Kennst du vielleicht ein gutes Tutorial zu diesem Thema?
private Nachricht | Beiträge des Benutzers
Khalid
myCSharp.de - Experte

Avatar #avatar-2534.gif


Dabei seit:
Beiträge: 3627
Herkunft: Hannover

beantworten | zitieren | melden

Hmm, zu WCF findet man einiges im Netz. Ein Tutorial kann ich dir allerdings nicht nennen.
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
private Nachricht | Beiträge des Benutzers
diamond
myCSharp.de - Member



Dabei seit:
Beiträge: 38
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

@Khalid,

schon gekauft! :-)
Danke dir, war ein guter Hinweis, den ich demnächst wohl etwas mehr auseinander nehmen werde.
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10083

beantworten | zitieren | melden

Du willst also genau das, was MS bei der Erstellung von ADO.NET als Designprinzip
genommen hat, wieder zu dem umkehren, was vorher in z.b. VB6 zu massiven
Problemen geführt hat?

Was Du vor hast bedeutet gerade in Multiuserumgebungen eine hohe Server Last und
ist auch sehr selten Sinnvoll.

Und das Abfragen von ConcurencyExceptions ist doch nicht wirklich ein Grund
alles über den Haufen zu werfen.
private Nachricht | Beiträge des Benutzers
diamond
myCSharp.de - Member



Dabei seit:
Beiträge: 38
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

@FZelle

ob und was ich will, weiß ich noch nicht, ich muss es ja erst erforschen.

was wäre dein Vorschlag?
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10083

beantworten | zitieren | melden

Das Prinzip von ADO.NET verstehen, akzeptieren, und dementsprechend zu handeln.
private Nachricht | Beiträge des Benutzers
diamond
myCSharp.de - Member



Dabei seit:
Beiträge: 38
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

@FZelle,

was wäre den das Prinzip? Denkst du da an was bestimmten?

Ich persönliche sehe an ADO.NET im Moment kaum was besseres, als beim ADODB bei VB6. Beide empfinde ich persönlich ungefähr gleich schlecht. Aber ich habe scheinbar auch nicht deine Erfahrungen!

Nichts für ungut, aber wenn deine nächste Antwort wieder so kurz und undeutlich ausfallen sollte, kannst du sie dir auch sparen. So hilft sie leider keinem weiter.
private Nachricht | Beiträge des Benutzers
Peter Bucher
myCSharp.de - Experte

Avatar #jVxXe7MDBPAimxdX3em3.jpg


Dabei seit:
Beiträge: 6141
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Hallo diamond
Zitat von diamond
Ich persönliche sehe an ADO.NET im Moment kaum was besseres, als beim ADODB bei VB6. Beide empfinde ich persönlich ungefähr gleich schlecht. Aber ich habe scheinbar auch nicht deine Erfahrungen!
Nein, die hast du wohl nicht.
Was findest du daran denn schlecht?
Und wie / was würdest du besser machen?
Zitat von diamond
Nichts für ungut, aber wenn deine nächste Antwort wieder so kurz und undeutlich ausfallen sollte, kannst du sie dir auch sparen. So hilft sie leider keinem weiter.
Wenn dir die Antworten nicht gefallen, ignoriere sie einfach.
Ansonsten mache weiter wie bisher und vergraule dir auch jede Antwort von anderen, die helfen wollen.


Gruss Peter
--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

- https://peterbucher.ch/ - Meine persönliche Seite
- https://fpvspots.net/ - Spots für FPV Dronenflüge
private Nachricht | Beiträge des Benutzers
diamond
myCSharp.de - Member



Dabei seit:
Beiträge: 38
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Hallo Peter,

verstehst du den das Prinzip von ADO.NET?
Erkläre es mir bitte.

Danke dir.
private Nachricht | Beiträge des Benutzers
Peter Bucher
myCSharp.de - Experte

Avatar #jVxXe7MDBPAimxdX3em3.jpg


Dabei seit:
Beiträge: 6141
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Hallo diamond
Zitat von diamond
verstehst du den das Prinzip von ADO.NET?
Was verstehst du unter dem Verstehen des Prinzips?
Zitat von diamond
Erkläre es mir bitte.
Was verstehst du nicht, wozu gibt es dutzende Bücher darüber und wieso hast du meine Fragen nicht beantwortet?


Gruss Peter
--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

- https://peterbucher.ch/ - Meine persönliche Seite
- https://fpvspots.net/ - Spots für FPV Dronenflüge
private Nachricht | Beiträge des Benutzers
Guts2
myCSharp.de - Member



Dabei seit:
Beiträge: 49

beantworten | zitieren | melden

Also ich hab noch nicht mit den Vorgängerversionen gearbeitet, oder dem anderen Kram den du da angesprochen hast. Aber ADO.Net ist Sammlung von Klassen für Verbindungen, Klassen die Tabellen im Arbeitsspeicher repräsentieren und Klassen die für gesammte Datenbank im Arbeitsspeicher stehen.


Mit diesen Klassen kann man dann schnell und einfach verbindungen zu Datenbanken herstellen und diese dann auch bearbeiten
private Nachricht | Beiträge des Benutzers
diamond
myCSharp.de - Member



Dabei seit:
Beiträge: 38
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Hallo Peter,

interessant!

Wie FZelle schrieb:
Zitat
Das Prinzip von ADO.NET verstehen, akzeptieren, und dementsprechend zu handeln.

was meint er wohl.

Ich denke in einem Forum wie diesem finde ich mehr und vor allem schneller Infos, als in Büchern.
Ich denke nur, in einem profi Forum sind Antworten ala
Zitat
Das Prinzip von ADO.NET verstehen, akzeptieren, und dementsprechend zu handeln.
Fehler am Platze, mehr nicht.

Aber OK.

Gut Peter, mein Problem:

Das Programm soll in einer SQL Server Datenbank Daten speichern. Das Programm wird von mehreren Usern gleichzeitig genutzt, sagen wir mal 10.
Jeder User kann die Daten sehen und Bearbeiten (es sind komplizierte Kundenstammdaten, die nicht mal eben in 5sek. eingepflegt sind, 10 Sätze).

User 1 bis 10 laden sich zur gleichen Zeit die 10 Sätze in eine DataTable. User 1 verändert den ersten Satz und speichert diesen. Die User 2 bis 10 wollen ebenfalls an den ersten Satz ran. Beim Speichern erhalten die 9 User eine Meldung, aufgrund einer Parallelitätsverletzung, Speichern nicht möglich. Sie ärgern sich, das sie nun die Daten komplett neu eintippen müssen. Jetzt sind die 9 User übrig, wieder zur gleichen Zeit und wieder gewinnt nur eine, die restlichen 8 ärgern sich, usw.

Das ist im Moment ein Problem, welches mir so sorgen bereitet. Eine Lösung gibt es sicherlich immer, nur möchte ich nicht voreilig irgend etwas Programmieren und später erfahren, dass es bereits länger andere bessere Techniken gibt.

Bei Access gibt es noch andere Probleme, wie z.B. die fehlende Aktualisierung der AutoWert Spalte in einer neuen eingefügten und abgespeicherten DateRow. Dafür habe ich zwar schon eine Lösung von einer Microsoft Seite, die im Moment noch gut ausschaut. Aber auch da frage ich mich einfach, warum hat man das nicht gleich vorgesehen. Das RecordSet Objekt von ADODB (VB6) konnte dieses z.B. besser.

Wenn man sich nun einige Tage mit solchen Probleme beschäftigt, fragt man sich vielleicht, ob es da nicht noch irgend welche anderen Schwächen gibt, die einem erst später auffallen, wo eine Änderung am Programm nicht mehr so einfach wäre.

Also erstelle ich das Thema hier im Forum, um zu erfahren, ob es da nicht irgend welche bessere Techniken gibt, zum Thema Multi User/Client App und SQL Server (oder MS Access).

Ich suche nicht nach einem Rat zu einem bestimmten Fehler/Problem, sondern frage Euch, die vielleicht mehr Ahnung haben, ob es irgend welche Techniken gibt.
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

dürfen die user ach realtime-parallel an den daten arbeiten? z.b. das user 1 gerade im moment einen wert ändert und dieser wird bei allen anderen user angezeigt?
Kaji
myCSharp.de - Member



Dabei seit:
Beiträge: 602
Herkunft: Clausthal-Zellerfeld

beantworten | zitieren | melden

Hallo,

also ADO.Net ist schon das richtige. Eine echte Parallität gibt es dort wohl sowieso nicht aber ADO.Net mit Microsoft SQL Server kann das so regeln das sie das abarbeiten. Es klingt jetzt aber ein wenig als würden 10User das selber eingeben? oO


Gruß Daniel
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

wir haben mal ein system implementiert, wo 300 user an einer größeren datenbank zeitgleich arbeiten konnten. hierbei wurden felder automatisch gelb hinterlegt, wenn sie gerade durch einen user bearbeitet wurden und rot, wenn diese bereits gespeichert wurden. der user konnte dann einstellen ob er automatisch den neuen wert sehen will oder ob er manuelle updates machen möchte. je nach rechtevergabe konnte er auch den alten wert wieder überspielen.

das ganze haben wir mit remoting unter .net 2.0 gelöst (wcf wäre aber schöner gewesen...) und anfangs nhibernate, später als dann auch offlinecontent usw interessant wurde, mussten wir auf open access umsteigen. das unterstützte zumindest offlinecontainer und versionierungen.
diamond
myCSharp.de - Member



Dabei seit:
Beiträge: 38
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

@Kaji,

die 10 User müssen nicht unbedingt dasselbe eingeben. Sobald einer der User gespeichert hat, können die anderen nicht am selben Satz speichern, da die Daten in der jeweiligen Datarow (lokal) sich auf einmal mit den auf dem Server unterscheiden.

Würde man versuchen, im Hintergrund die Daten in der lokal DataTable oder DataRow immer vom Server zu refreshen, gäbe es vielleicht keine Warnungen aber im nachhinein immer noch viel Probleme. Den dann würden alle User speichern können und es würde immer der Satz vom letzten User gewinnen.

Das was JAck30lena beschreibt, mit gelben und roten Feldern, daran hatte ich auch mal gedacht. Aber zunächst müsste man es irgend wie realisieren, dass alle Client von jeder Änderung an den Daten irgend wie mitbekommen (auf dem SQL Server bekommt man z.B. eine Event, bei Änderung an Daten, bei MS Access eher nicht).

Und was dann? Dann würde der erste User Daten verändern und die restlichen 9 sehen, dass es eine Änderung gibt, das eigentliche Problem würde aber weiterhin bestehen bleiben. Die restlichen 9 User könnten nicht speichern, da sich die Daten in der lokalen DataTable wieder mit dennen in der Datenbank unterscheiden würden.

Oder denke ich einfach zu kritisch?
private Nachricht | Beiträge des Benutzers
Kaji
myCSharp.de - Member



Dabei seit:
Beiträge: 602
Herkunft: Clausthal-Zellerfeld

beantworten | zitieren | melden

Hallo,

ich glaube du hast da ein grundsätzlichen fehler drinne ... ;) Jeder User updatet nur seinen einen Teil den er geändert hat und will nicht mit seiner lokalen Datatable alles überschreiben.

Gruß Daniel
private Nachricht | Beiträge des Benutzers
diamond
myCSharp.de - Member



Dabei seit:
Beiträge: 38
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

@Kaji,

in meinem Fall wollen alle 10 User auf dem selben Satz schreiben.

solange sie auf unterschiedlichen Sätzen schreiben, wäre es zunächst in Ordnung, bis dann wieder ein User 5 neben seinem Satz, den Satz vom User 10 ändern will.
private Nachricht | Beiträge des Benutzers
Krieger
myCSharp.de - Member



Dabei seit:
Beiträge: 81
Herkunft: Rosenheim

beantworten | zitieren | melden

Hallo diamond,

ich habe mir alle Posts durchgelesen und irgendwie kam mir immer wieder die frage: Warum wollen die User auf dem selben Datensatz arbeiten?

Für mich stellt sich mit den sperrlichen Informationen eines der folgenden Probleme dar:

1) Das Unternehmen hat extreme Probleme mit seinen Workflows ( wie können 2 Sachbearbeiter am selben Satz arbeiten )
2) Die Datenbank folgt nicht den Normalisierungs Richtlinien, was implizit bedeutet, dass eine Tablle zuviele Informationen hält, die nicht Atomar sind, was wiederum zwangsläufig dazu führt, dass 2 User am selben Datensatz arbeiten.

Ich würde empfehlen: Data Rows Locken, sodass 1er dran arbeiten kann, 9 haben den Satz Readonly geöffnet. Und beim Commit in die Datenbank überall die Row updaten.
private Nachricht | Beiträge des Benutzers
Peter Bucher
myCSharp.de - Experte

Avatar #jVxXe7MDBPAimxdX3em3.jpg


Dabei seit:
Beiträge: 6141
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Hallo diamond

Dito mit Krieger: Locking und Transaktionen wären Stichwörter.


Gruss Peter
--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

- https://peterbucher.ch/ - Meine persönliche Seite
- https://fpvspots.net/ - Spots für FPV Dronenflüge
private Nachricht | Beiträge des Benutzers
Kaji
myCSharp.de - Member



Dabei seit:
Beiträge: 602
Herkunft: Clausthal-Zellerfeld

beantworten | zitieren | melden

Hallo,

ja deswegen reden ja auch hier genug Leute darüber das du ein Service schreiben sollst der dann die Datenbank operationen übernimmt. Wie du die User managet musst du selbst wissen. Es ist wie im realen leben 2 Leute können nicht den selben Satz auf der Schreibmaschine bearbeiten. Deswegen müssen sich die Leute untereinander einigen oder einer kriegt Priorität. Oder du zeigst dem der langsamer ist als der anderen den geänderten Satz und er kann entscheiden ob er den neuen oder seinen Satz nehmen will.

Gruß Daniel
private Nachricht | Beiträge des Benutzers
Krieger
myCSharp.de - Member



Dabei seit:
Beiträge: 81
Herkunft: Rosenheim

beantworten | zitieren | melden

Zusatz:

Zur Normalisierung: http://de.wikipedia.org/wiki/Normalisierung_(Datenbank)

@Kaji

Der Service Ansatz ist da etwas übertrieben, das bekommt man mit ADO schon hin.
private Nachricht | Beiträge des Benutzers
diamond
myCSharp.de - Member



Dabei seit:
Beiträge: 38
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Hallo,

Auch ich würde dem zustimmen, dass > 1 User nicht an einem und dem selben Satz zu arbeiten haben, aber die Realität ist da leider anders.
Es kommt leider tatsächlich vor.
Bei einer Schreibmaschine handelt es sich ja auch um genau 1 Eingabegerät, mit genau 1 PC wäre das auch kein Problem.
In dem Fall sitzen aber die User weg von einander entfernt und sogar theoretisch ist es denkbar, dass beide an dem gleichen Satz schreiben wollen.

@Krieger:
Wenn ich eine DataRow sperren könnte, wäre das eine Hilfe. Nur wüsste ich nicht wie!
Ich denke die DataTable ist ein lokales Abbild im speicher, wie soll man den eine einzige Row davon sperren, so dass die Sperre synchron bei allen anderen wirksam wird?

@Kaji
Zitat
Deswegen müssen sich die Leute untereinander einigen oder einer kriegt Priorität. Oder du zeigst dem der langsamer ist als der anderen den geänderten Satz und er kann entscheiden ob er den neuen oder seinen Satz nehmen will.

Kannst du dir vorstellen, dass Kunden die mit deinem Programm arbeiten wollen und dafür Geld bezahlt haben, dir für eine solche Lösung das Programm um die Ohren hauen würden? Ich meine, ich stimme dir zu, aber in der Realität ist es anders, die Leute reden weniger mit einander, es sei den es läuft was schief. :-(

-------------------------------------------------

Ich würde es sogar in Kauf nehmen, wenn immer der letzte User beim Speichern gewinnen würde. Aber das Problem ist, dass schon nach dem ersten User niemand mehr Speichern kann, ohne dass er die DataTable vorher refreshen müsste -> wegen Parallelitätsverletzung.


Alles nicht rosig.
private Nachricht | Beiträge des Benutzers