Konfliktlösung bei DataAdapter-Updates auf eine Datenbank

29/02/2008 - 00:33 von PKlemm | Report spam
Ich suche nach einer "best practice" Methode zur Lösung von Konflikten beim
Update eines Datasets auf eine Datenbank.
Hier ein Beispielszenario:
Eine Access Datenbank besteht aus mehreren Tabellen, die über Relationen
miteinander verknüpft sind.
Die Tabellen besiten alle einspaltige PrimaryKeys vom Typ Guid und die
ForeignKeys bestehen demnach auch nur aus GUIDs.
Diese Struktur wird exakt in einem Dataset nachgebildet (OleDbDataAdapter,
FillSchema, Fill ...).
Im Dataset wird nun eine Row geàndert. In der Datenbank findet an der selben
Row auch eine Änderung statt.
Wegen der relationalen Verknüpfungen soll nun über eine
Transaktionskontrolle geregelt werden,
dass bei einem Update alle Tabellenànderungen des Datasets fehlerfrei
übertragen werden sollen, bevor committed wird.
Beim nàchste transaktionskontrollierten Update des Datenadapters wird nun
(wie erwartet) das DBConcurrencyException ausgelöst.
Was nun?
Ich würde erwarten, dass mir der RowUpdating Event des Datenadapters den
Konfliktdatensatz aus der Datenbank anbietet,
um vom Benutzer eine Entscheidung einfordern zu können, welche Änderung nun
gelten soll.
Leider finde ich im OleDbRowUpdatingEventArgs den Konfliktdatensatz nicht.
Man müßte erneut eine Datenbankabfrage
durchführen - was ich eigentlich nicht möchte, denn der Datenadapter muss
den Datensatz ja bereits kennen.
Angenommen, eine Entscheidung könnte gefàllt werden: Wie kann dann der
Datenbank die Änderung aus
dem DataTable aufgezwungen werden?

Sorry wegen des vielen Textes!
 

Lesen sie die antworten

#1 Peter Fleischer
01/03/2008 - 17:03 | Warnen spam
"PKlemm" schrieb im Newsbeitrag
news:
Ich suche nach einer "best practice" Methode zur Lösung von Konflikten
beim
Update eines Datasets auf eine Datenbank.
Hier ein Beispielszenario:
Eine Access Datenbank besteht aus mehreren Tabellen, die über Relationen
miteinander verknüpft sind.
Die Tabellen besiten alle einspaltige PrimaryKeys vom Typ Guid und die
ForeignKeys bestehen demnach auch nur aus GUIDs.
Diese Struktur wird exakt in einem Dataset nachgebildet (OleDbDataAdapter,
FillSchema, Fill ...).



Welchen Grund gibt es dafür. So etwas ist nur bei sehr kleinen Anwendungen
üblich bzw. sinnvoll. Will man beispielsweise in einer Anwendung nur einige
wenige Spalten nutzen, so ist es sinnlos alle Spalten zu laden. Làdt man nur
die benötigten Spalten in ein DataSet, in dem alle Spalten deklariert sind,
dann gibt es Konflikte bei Feldern, die kein DBNull zulassen.

Im Dataset wird nun eine Row geàndert. In der Datenbank findet an der
selben
Row auch eine Änderung statt.
Wegen der relationalen Verknüpfungen soll nun über eine
Transaktionskontrolle geregelt werden,
dass bei einem Update alle Tabellenànderungen des Datasets fehlerfrei
übertragen werden sollen, bevor committed wird.



Das ist üblich und normal.

Beim nàchste transaktionskontrollierten Update des Datenadapters wird nun
(wie erwartet) das DBConcurrencyException ausgelöst.
Was nun?



Wie sieht denn die Orglösung für Konflikte aus? Diese ist vor der
Implementierung zu erarbeiten. Wenn da beispielsweise festgelegt ist "Der
letzte gewinnt", dann gibt es keine Konkurrenzprobleme.

Ich würde erwarten, dass mir der RowUpdating Event des Datenadapters den
Konfliktdatensatz aus der Datenbank anbietet,
um vom Benutzer eine Entscheidung einfordern zu können, welche Änderung
nun
gelten soll.



Der Konflikt kann erst nach der Prüfung festgestellt werden. Oder kannst die
Farbe einer Flàche ermitteln, ohne diese Flàche erst einmal zu sehen?

Leider finde ich im OleDbRowUpdatingEventArgs den Konfliktdatensatz nicht.



Den bekommst du erst im OnRowUpdated!

Man müßte erneut eine Datenbankabfrage
durchführen - was ich eigentlich nicht möchte, denn der Datenadapter muss
den Datensatz ja bereits kennen.



Natürlich kennt er ihn nach dem ersten erfolglosen Versuch.

Angenommen, eine Entscheidung könnte gefàllt werden: Wie kann dann der
Datenbank die Änderung aus
dem DataTable aufgezwungen werden?



Wie sieht denn die Organisationslösung für den Konfliktfall aus? Da gibt es
viele Möglichkeiten.

Viele Gruesse

Peter

Ähnliche fragen