Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   C# DataAdapter.Update + RejectChanges: Verständnisproblem (https://www.delphipraxis.net/79158-dataadapter-update-rejectchanges-verstaendnisproblem.html)

Jürgen Thomas 17. Okt 2006 12:56

Datenbank: Firebird • Version: 2.0 RC4 • Zugriff über: Firebird NET Provider 2.0 RC1 von #D 2.0 aus

DataAdapter.Update + RejectChanges: Verständnisproblem
 
Hallo,

hurra, ich komme voran: Ich kann jetzt Daten erfassen (mit automatischer Konvertierung und vielfacher Analyse aus HTML-Dateien), speichern, einlesen und ändern mit folgenden Konstruktionen (stark verkürzt dargestellt):
Code:
//  Typisiertes DataSet ds
dataFactory = sc.DbProviderFactories.GetFactory("FirebirdClient");
conn = dataFactory.CreateConnection();
da = dataFactory.CreateDataAdapter();
da.SelectCommand = dataFactory.CreateCommand();
da.SelectCommand.CommandText = "SELECT * FROM " + tbl.TableName;
cmdb = dataFactory.CreateCommandBuilder();
cmdb.DataAdapter = da;
da.Fill(ds, tbl.TableName);
da.InsertCommand = cmdb.GetInsertCommand();
Das funktioniert jetzt, wie gesagt:
  • 1. HTML-Datei analysieren
    2. Daten in die Haupttabelle tbl des Dataset eintragen
    3. zusätzliche Informationen prüfen, mit anderen Tabellen vergleichen und ggf. ändern
    4. Daten aus der Haupttabelle tbl in der Datenbank speichern über da.Update(tbl); Achtung: erst jetzt soll wirklich gespeichert werden!!!
Mein Problem ist nun: Die Schritte in 3. - prüfen, vergleichen, ändern - werden in einem eigenen Formular ausgeführt; Änderungen, die dabei vorgenommen werden, sollten mit AcceptChanges() bestätigt oder mit RejectChanges() zurückgenommen werden können. Aber dies wirkt sich anders aus als gewünscht:
  • Wenn ich AcceptChanges() aufrufe, ohne die Daten vorher in die Datenbank übertragen, werden alle Neuaufnahmen als erledigt betrachtet. Wenn ich also eine manuelle Änderung bestätige, werden alle Neuaufnahmen nicht mehr gespeichert.
  • Wenn ich RejectChanges() aufrufe, wird nicht nur eine manuelle Änderung verworfen, sondern auch jede vorherige Neuaufnahme.
Wie kann ich das von mir gewünschte Verhalten erreichen:
  • den Status nach Abschluss von Punkt 2 im Dataset festhalten
  • spätere Änderungen bestätigen oder verwerfen
  • die vollständige Tabelle vom Dataset in die Datenbank übertragen
Danke für Tipps! Jürgen

Elvis 17. Okt 2006 13:03

Re: DataAdapter.Update + RejectChanges: Verständnisproblem
 
Du kannst dir die Deltas vom DataSet generieren lassen (Siehe DataSet/DataTable.GetChanges).
Diese kannst du dann als eine Art Savepoint hinterlegen bzw. bei jedem weiteren Savepoint per Dataset.Merge mit den Deltas dieses Abschnittes verschmelzen. Zum Schluss führst du Update über die Gesamtmegne der Deltas aus.

Klingt aber IMHO ziemlich bescheuert, ich kenne ich nicht mit DataSets aus. ;)

Jürgen Thomas 17. Okt 2006 13:54

Re: DataAdapter.Update + RejectChanges: Verständnisproblem
 
Zitat:

Zitat von Elvis
Du kannst dir die Deltas vom DataSet generieren lassen (Siehe DataSet/DataTable.GetChanges).
Diese kannst du dann als eine Art Savepoint hinterlegen bzw. bei jedem weiteren Savepoint per Dataset.Merge mit den Deltas dieses Abschnittes verschmelzen. Zum Schluss führst du Update über die Gesamtmegne der Deltas aus.

Klingt aber IMHO ziemlich bescheuert, ich kenne ich nicht mit DataSets aus. ;)

Danke, ich glaube, das ist das passende Vorgehen für mich. Ich vermute, genau für solche Situationen ist GetChanges() vorgesehen.

Aber wenn Du nicht mit DataSets arbeitest: machst Du alles mit DataReader, oder wie regelst Du die Anbindung an die Benutzeroberfläche?

Grüße Jürgen

Elvis 17. Okt 2006 14:17

Re: DataAdapter.Update + RejectChanges: Verständnisproblem
 
Zitat:

Zitat von Jürgen Thomas
Aber wenn Du nicht mit DataSets arbeitest: machst Du alles mit DataReader,

Ich frage Daten mit Readern ab, richtig. Aber nicht direkt. Dafür benutze ich einen kleinen ORM.
Zitat:

oder wie regelst Du die Anbindung an die Benutzeroberfläche?
Databinding hat in .Net rein gar nix mit DataSets zu tun. Auch wenn die vorhandenen IDEs zu blöd sind um Objektbindungen besser zu unterstützen.
DataSets müssen ganz schön Achten laufen um ihren Inhalt an die UI weiterzureichen oder wenn du im Code darauf zu greifst.
Ich mache das lieber mit konkreten Klassen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz