Client-Server; Master-Detail Tabelle ..... Fill und Update DeadLock

Ich habe folgendes Problem:
 Ich besitze einen Windows-Forms-Client mit meinem DataSet, das ich beim Start der Anwendung mit Daten vom Server fülle.

--------------------
oracleDataAdapterMaster.Fill(datasetTest);
oracleDataAdapterClient.Fill(datasetTest);
--------------------

 Beim Beenden der Applikation speichere ich die gemachten Änderungen wieder zurück in die Datenbank und zwar per:
(Reihenfolge wichtig)
--------------------
oracleDataAdapterMaster.Update(datasetTest);
oracleDataAdapterDetail.Update(datasetTest);
--------------------

 Nur funktioniert das natürlich nicht wenn ein MasterDatensatz mit samt seinen Details gelöscht wurde.
Denn zuerst will der DataAdapter die MasterTabelle schreiben (delete, update,insert), aber es existieren noch DetailDatensätze in der DetailTabelle.

Denn in der DB wurde eine Beziehung mit referent. Integrität definiert und wir wollen kein

ON DELETE CASCADE

  Lösung: (von Stephan Kerbei)

Die Lösung könnte sein, das DataSet zu splitten. Z.B.so:
 --------------------

// macht ein neues DS, in dem nur die "neuen" Rows aus dem alten DS stehen.

DataSet Dummy = grossesDataSet.GetChanges(DataRowState.Added);
 myAdapter.Update(Dummy);
 // macht ein neues DS, in dem nur die gelöschten Rows aus dem alten DS stehen.
Dummy = grossesDataSet.GetChanges(DataRowState.Deleted); 
myAdapter.Update(Dummy);

--------------------
 Persönliche Meinung (Stephan Kerbei):
  Der DataAdapter ist prima, wenn man "mal eben schnell" was machen will. Für größere, professionelle Anwendungen taugt er nicht. Zum einen ist er sehr langsam, zum anderen gibt es Aufgabenstellungen, die er nicht in den Griff kriegt. Oft ist das Arbeiten mit einem Command-Objekt die bessere Lösung.

No comments:

Post a Comment

Latest Posts

Popular Posts