Laden...

Datenbank und Objektliste List<Klasse>

Erstellt von erick vor 16 Jahren Letzter Beitrag vor 16 Jahren 3.658 Views
E
erick Themenstarter:in
9 Beiträge seit 2006
vor 16 Jahren
Datenbank und Objektliste List<Klasse>

Hallo,

ich versuche schon seite Tagen das folgende Problem zu lösen:

Im zuge meiner Projektarbeit soll ich mit Objeklisten List<Klasse> Daten aus einer DB SQL-ServerExpress auslesen und via GUI bearbeiten (Editieren, Hinzufügen, löschen).
Das ganze funktioniert soweit bis zu dem Punkt wo ih die Daten in die DB schreiben wil.
Ich weiss nähmlih nicht was ich in die DB schreiben soll also welde Datensätze haben sich geändert wurden gelöscht ......

Das ganze Projekt wurde mit Objeklisten aufgebaut um Vererbung usw. darzustellen.

Das Projekt ist folgend aufgebaut.

Fachklassen
Persistenzmamager
GUI in der Listen mit den Fachklassen als Datasource für DataGridView, Textboxen und Comboboxen dienen.

Also wie gesagt das lesen ist ja OK aber das abspeichern der Änderungen in den Objektlisten verstehe ich nicht.

Dank für Eure Hilfe

mfg Erick

1.373 Beiträge seit 2004
vor 16 Jahren

Hallo,

Du solltest ein Objekt haben, dass die Änderungen aufzeichnet. Idealerweise laufen alle Datenbank-Zugrife über dieses Objekt ab. Das Interface besteht (im einfachsten Fall) z.B. aus diesen Methoden:


IList<T> GetAll<T>();
T GetByID<T>(int id); // Annahme: alle Objekte haben eine int-ID
void Delete(object entity);
void Save(object entity);
void Flush();

Ganz zentral ist die Flush Methode, welche den Datenbank-Inhalt mit dem Inhalt im Speicher synschronisiert. Das geht etwa wie folgt: Wann immer etwas geladen wird (mittels GetByID oder GetAll), "merkt" sich dieser Manager die Objekte in einer internen Liste ("persistente Objekte"). Beim Aufruf von "Flush" schreibt der Manager alle Daten dieser internen Liste in die Datenbank. Bei einem Aufruf von "Delete" verschiebst du das besagte Objekt von der internen Liste in eine zweite interne Liste, in der du alle zu löschenden Objekte speicherst. Bei Flush werden jetzt auch alle Objekte auf der "zu löschen" Liste aus der Datenbank gelöscht.

Zu guter letzt hast du noch die Save() Methode. Mit ihr fügst du ein neues (zuvor nicht persistentes Objekt) in die interne "persistente-Objekte"-Liste zu. Beim Flush werden die neuen Objekte auch in der Datenbank gespeichert.

Wie unterscheidest du neue Objekte (INSERT) und zu aktualisierende Daten (UPDATE)? Am einfachsten legst du fest, dass Objekte mit einer bestimmten ID (z.B. 0) "neu" sind (=> INSERT), die anderen sind bekannt (=> UPDATE).

Das ist natürlich ein ganz primitives Konzept sehr grob ausgearbeitet. Aber so ungefähr funktioniert auch das Lifecycle Management der "großen" Objekt-Relational Mapper wie NHibernate.

Dieses Manager Objekt ist übrigens ein prima Kandidat für das Unit of Work-Pattern

Grüße,
Andre

E
erick Themenstarter:in
9 Beiträge seit 2006
vor 16 Jahren
Danke

Hallo,
zuerst mal Sorry für die späte Antwort.

Ich habe es mir gedacht das mir die zweite Liste nicht erspart bleibt.
Ich habe es so gelöst:
Ein ENUM mit den Werten (Nothing, Edit, New, Delete)
Bei einer Änderung Setze ich das entsprechende Flag und wähle beim sichern in die DB das passende SQL-Statement aus.

Danke

mfg Erick

563 Beiträge seit 2004
vor 16 Jahren

Warum willst du alles neu erfinden? Das DataSet kann dies ja bereits alles, mitels SqlDataAdapter und DataSet.Update() wird Datensatzgenau das entsprechende Query ausgeführt. Zudem werden Diverse Sortier, Such & Filterfunktionen angeboten.

Gruss,
.unreal

1.373 Beiträge seit 2004
vor 16 Jahren

Oder eben NHibernate, wenn du mit Objekten statt mit DataSets arbeiten möchtest.

563 Beiträge seit 2004
vor 16 Jahren

Ich wkenn nhibernate leider noch nicht gut, ich weiss nur dass es existiert 🙂 Iist etwas dass ich schon seit längerem vorhabe anzuschauen. Darf ich mal unwissend und nicht nachgeforscht Fragen, wie die Darstellung der Daten bei nhibernate funktioniert? Wird Databinding unterstztütz?

Gruss,
.unreal

1.373 Beiträge seit 2004
vor 16 Jahren

Hallo,

NHibernate ist nur für den Transfer zwischen Anwendung und Datenbank gedacht. Was Anwendungsseitig aus NHibernate "rauskommt", sind ganz normale Objekte ganz normaler Klassen. Die Darstellung/Datenbindung ist nicht anders als mit "normal" erzeugten Objekten, d.h. man kann z.B. die ObjectDataSource verwenden.

Grüße,
Andre

M
110 Beiträge seit 2007
vor 16 Jahren

Hallo Erick,

es stimmt das das DataSet sich den Zustand einer DataRow innerhalb einer DataTable merkt und entsprechend die Daten in die Datenbank eingefügt, aktualisiert, oder gelöscht werden.

Aus meiner Sicht ist das Problem, dass die typsicherheit fehlt. Verwendet man die typisierten DataSets ist das ganz sehr langsam.

Vielleicht kann ich Dir neben NHibernate ( finde ich einen sehr guten O/R Mapper) auch Invist zum anschauen empfehlen. Dort werden zu den Datenbanktabellen die Klassen generiert. Über einen PErsistenceManager wird die PErsistence geregelt. Die Datenobjekte wissen welchen zustand sie haben und werden dementsprechende in der Datenbank eingefügt, gelöscht und aktualisiert. Eigentlich genau wie bei DataSet, nur typsicher.

Gruss

Mirko

Mappen statt hacken mit Invist , dem .NET O/R Mapper - Code Generator