DataBinding und Multi-User-Zugriff

02/06/2010 - 21:03 von Nico Wessels | Report spam
Hallo NG;

ich habe in meinem Programm eine Anbindung an eine Datenbank. In der
Oberflàche sind die Daten in einem DataGridView und TextBoxen per
DataBinding angebunden. Zusàtzlich existiert ein BindingNavigator, über
den man durch die Datensàtze navigieren kann und Datensàtze
hinzufügen/löschen können soll.

DataBinding:
==
string sqlSelectCommand = String.Format("SELECT * FROM {0}", MY_TABLE);

DataSet dataset = new DataSet();
DbDataAdapter adapter = mydbconnector.GetDataAdapter(sqlSelectCommand);
adapter.Fill(dataset);

DataTable dataTable = dataset.Tables[0];
BindingSource bs = new BindingSource();
bs.DataSource = dataTable;
bindingnavigator.BindingSource = bs;
dataGridView.DataSource = datasource;



BindingNavigator:
=
Hier habe ich das Ereignis zum Hinzufügen neuer Zeilen implementiert:

DataRow newRow = dt.NewRow();
newRow["ID"] = ...;
newRow["Name"] = ...;
dataTable.Rows.Add(newRow);


Save-Button:
==
Im Binding-Navigator hab ich auch noch den Button zum Speichern
implementiert:

DataTable changes = dt.GetChanges();
string sqlInsertCommand = String.Format("INSERT INTO {0} VALUES(@ID,
@Name)", MY_TABLE);

adapter.InsertCommand = ...
adapter.Update(dt);




Ich habe hier ein Update gemacht, was eigentlich nur die Daten per
INSERT-Statement einfügt, aber was wenn die Daten bereits in der DB
sind? Wie bekomme ich eine Rückmeldung, die ich evtl. dem User anzeigen
kann? Frage mich auch, was passiert, wenn ein anderer Nutzer, die Daten
bereits im Hintergrund geàndert hat? Kann ich das irgendwie vorher abfragen?

Ich könnte jetzt noch genügend Einzelfragen zu diesem Themenkomplex
stellen, um es aber kurz zu machen: Wie realisiere ich sauber (!!)
dieses DataBinding, so dass es auch in einem Mult-User Betrieb möglichst
konsistent ist. Hat hier jemand ein funktionierendes Beispiel?

Frage auch noch in diesem Zusammenhang wegen Updates: wie bekomme ich
denn am besten ein Update in meine Daten bzw. mein DataBinding, wenn ein
anderer User im Hintergrund was an der DB geàndert hat? Irgendwie sollte
ich hier ja die Daten auch möglichst konsistent dem Anwender
pràsentieren. Also wenn ein anderer User einen Datensat gelöscht hat,
sollte der bei mir auch nicht mehr angezeigt werdne. Fügt ein anderer
User einen Datensatz hinzu, sollte ich den auch sehen.


Wie geht man denn hier vor??
 

Lesen sie die antworten

#1 Peter Fleischer
03/06/2010 - 08:36 | Warnen spam
"Nico Wessels" schrieb im Newsbeitrag
news:
...
Ich habe hier ein Update gemacht, was eigentlich nur die Daten per
INSERT-Statement einfügt, aber was wenn die Daten bereits in der DB sind?
Wie bekomme ich eine Rückmeldung, die ich evtl. dem User anzeigen kann?
Frage mich auch, was passiert, wenn ein anderer Nutzer, die Daten bereits
im Hintergrund geàndert hat? Kann ich das irgendwie vorher abfragen?



Hi Nico,
zuerst sollte mal eine Konfliktlösungsstrategie erstellt werden. Am
einfachsten ist das, wenn man sich vorstellt, dass es keinen Rechner gibt
und unterschiedliche Mitarbeiter an gleichen Sachverhalten arbeiten, z.B. in
einem Lager, in dem unterschiedliche Lageristen Lagerteile entnehmen und der
Disponent entscheiden muss, was zu bestellen ist. Wie würde man so etwas
stabil nur mit Papier lösen? Wenn du dafür eine Technologie festgelegt hast,
dann kannst du diese auch auf dem Rechner umsetzen.

Wenn also festgelegt wurde, dass ein INSERT andere aktive Clients zu
informieren hat, dann muss der Insert-Trigger z.B. MSMQ anstoßen. Die andere
Alternative wàre, dass sich jeder Client selbst informiert und beim Versuch,
zwischenzeitlich geànderte Daten zu überschreiben, informiert wird
(Konkurrenzbedingung). Irgendwie vorher abfragen ist keine gute Idee, da
zwischen Abfrage und Änderung ja auch ein anderer Client àndern kann. Ein
Blockieren der Daten sollte auch überdacht werden, da damit die Anwendung
verlangsamt werden kann.

Ich könnte jetzt noch genügend Einzelfragen zu diesem Themenkomplex
stellen, um es aber kurz zu machen: Wie realisiere ich sauber (!!) dieses
DataBinding, so dass es auch in einem Mult-User Betrieb möglichst
konsistent ist. Hat hier jemand ein funktionierendes Beispiel?



Welche Konfliktlösungs-Strategie? Für die Strategie "Der Letzte gewinnt"
gibt es einfache Lösungswege.

Frage auch noch in diesem Zusammenhang wegen Updates: wie bekomme ich denn
am besten ein Update in meine Daten bzw. mein DataBinding, wenn ein
anderer User im Hintergrund was an der DB geàndert hat? Irgendwie sollte
ich hier ja die Daten auch möglichst konsistent dem Anwender pràsentieren.
Also wenn ein anderer User einen Datensat gelöscht hat, sollte der bei mir
auch nicht mehr angezeigt werdne. Fügt ein anderer User einen Datensatz
hinzu, sollte ich den auch sehen.

Wie geht man denn hier vor??



Auch hier wieder - welche Konfliktlösungsstrategie wird gewünscht? Wenn
jeder Client jeden anderen Client über jeden Schritt bei der Änderung des
Datenbestandes sofort informieren soll, dann muss ein entsprechendes
Kommunikationsmodell erarbeitet werden und natürlich auch das System mit dem
dafür notwendigen nicht zu unterschàtzenden Ressourcenumfang ausgerüstet
werden. Für einen Änderungswunsch wird der betreffende Datenbestand
blockiert (z.B. mit Transaction-Scope).

Das andere Ende eine Konfliktlösungsstrategie ist: Jeder Client holt sich
die aktuelle Information bei Bedarf (Refresh der Anzeige) und beim Speichern
gewinnt der Letzte.

Dazwischen gibt es unendlich viele Varianten.


Viele Gruesse

Peter

Ähnliche fragen