Daten aktualisieren mit DataAdapter

10/12/2007 - 09:22 von Dominik Sauer | Report spam
Hallo NG,

zur Zeit beschàftige ich mich mit dem Datenzugriff mittels ADO.Net und
bin auf eine Frage gestoßen die mir das Internet nicht beantworten
konnte.

Ich arbeite derzeit an einer Anwendung die Daten von Feinwaagen
empfàngt, auswertet und auf einen MySQL-Server speichert.
Dieses Programm soll auf mehreren Computern gliechzeitig laufen
können.

Daten aus der Datenbank holen ich über das DataSet-Objekt.
Speichern möchte ich sie mit dem CommandBuilder.

Hierbei frage ich mich was passiert wenn zwei oder mehr Nutzer das
DataSet-Objekt gleichzeitig bearbeiten und nacheinander Updaten?
Werden alle Daten in die Datenbank gespeichert oder nur die Daten des
letzten bearbeiteten DataSets?
Wenn dem so ist?
Wie kann man realisieren, dass alle Daten in meine DB gespeichert
werden?

Ich hoffe Ihr könnt mit weiterhelfen.

MfG Dominik
 

Lesen sie die antworten

#1 Peter Götz
10/12/2007 - 10:26 | Warnen spam
Hallo Dominik,

Ich arbeite derzeit an einer Anwendung die
Daten von Feinwaagen empfàngt, auswertet
und auf einen MySQL-Server speichert.
Dieses Programm soll auf mehreren Computern
gliechzeitig laufen können.



Das bedeutet, Du musst Dir eine Strategie zur
Konfliktlösung beim Zugriffe mehrerer Benutzer
überlegen.

Daten aus der Datenbank holen ich über das
DataSet-Objekt.



Ein DataSet macht nur dann Sinn, wenn Du einen
Container für mehrere DataTables benötigst, die
z.B. über DataRelations in Beziehung gesetzt
werden sollen.

Speichern möchte ich sie mit dem CommandBuilder.



Der CommandBuilder speichert keine Daten, er
erstellt lediglich die erforderlichen SQL-Statements,
bzw. die entspr. Update-, Insert- und Delete-Commands.

Hierbei frage ich mich was passiert wenn zwei
oder mehr Nutzer das DataSet-Objekt gleichzeitig
bearbeiten



Bis hierher passiert erst mal noch gar nichts, da die
DataSets bei den einzelnen Clients nichts voneinander
wissen.

und nacheinander Updaten?



Das kommt auf die von Dir gewàhlte Speicherstrategie
an. Du kannst im einfachsten Fall nach dem Muster
"wer zuletzt speichert hat gewonnen":

Update . Where ID = 123

Mit einem solchen UpdateCommand würde der
jeweilige Benutzer den Datensatz mit der ID = 123
mit seinen akt. Daten überschreiben und somit
Änderungen, welche andere Benutzer an diesem
Datensatz vorher gemacht haben ebenfalls
überschreiben.

Mit einem UpdateCommand, dessen Where-Klausel
nicht nur das Feld ID sondern, alle Felder des
Datensatzes erfasst, würden die Daten nur dann
überschrieben, wenn seit dem letzten Einlesen des
Datensatzes kein anderer Benutzer diesen Datensatz
veràndert hat. In Deiner Fehlerbehandlung kannst Du
einen solchen Konflikt erkennen und entsprechend
darauf reagieren.

Werden alle Daten in die Datenbank gespeichert
oder nur die Daten des letzten bearbeiteten DataSets?



Diese Frage verstehe ich nicht so recht, was vermutlich
damit zusammenhàngt, dass Du offenbar eine falsche
Vorstellung von einem DataSet hast.

Wenn dem so ist?
Wie kann man realisieren, dass alle Daten in meine
DB gespeichert werden?



Du kannst Updates an einem Datensatz mit einer
Where-Klausel machen, die nur das (die) ID-Feld(er) des
Datensatzes erfassen um vorherige Änderungen
anderer Benutzer einfach zu überschreiben.

Du kannst Updates an einem Datensatz mit einer
Where-Klausel die alle Felder des Datensatzes
umfasst machen, was dazu führt, dass ein solcher
UpdateCommand einen Fehler auslöst, wenn der
Datensatz zwischenzeitlich von einem anderen
Benutzer veràndert worden ist.
In diesem Fall kannst Du beispielsweise, den Benutzer
fragen, ob er die vorherigen Änderungen überschreiben
oder eben nicht überschreiben will. Wenn ja, ànderst
Du die Where-Klausel Deines UpdateCommands so,
dass sie nur noch das (die) ID-Feld(er) umfasst und
startest einen erneuten Speicherversuch.
Du könntest in einem solchen Fall bei Bedarf aber
auch statt eines erneuten Speicherversuches mit
einem UpdateCommand einen InsertCommand
erstellen und damit die akt. Daten als neuen Datensatz
speichern.
Welche Strategie Du wàhlst, hàngt von der Art Deiner
Anwendung und deren Anforderungen ab.

Ich hoffe Ihr könnt mit weiterhelfen.



Ich vermute mal, Du wirst bereits erahnen, dass es,
sofern man nicht nach dem einfachen Prinzip "wer
zuletzt speichert hat gewonnen" arbeitet, schon etwas
komplexer wird und man eine solche Anwendung
nicht mehr nur einfach mit dem Designer zusammenklicken
kann. Es müssen dann schon umfangreicherer Routinen
zur Konfliktlösung beim Mehrbenutzerbetrieb geschrieben
werden.

Dazu solltest Du aber erst mal verstanden haben, wie
die grundlegenden DataObjekte von ADO.net arbeiten
und zusammenwirken.
Deshalb solltest Du Dich zuerst mit der Arbeitsweise
von Connection-, Command- sowie DataReader-
und DataAdapter- Objekten vertraut machen. Dazu
gehört auch das Verstàndnis von DataTables und
evtl. deren Verbindung über DataRelations. Im
Zusammenhang mit den Command-Objekten solltest
Du Dir auch unbedingt ansehen, wie diese mit
Parameter-Objekten zusammenarbeiten.

Div. Beispielprogramme, die mit den o.g. DataObjekten
arbeiten findest Du unter

www.gssg.de -> Visual Basic -> VB.net


Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen