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
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
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
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
Oder eben NHibernate, wenn du mit Objekten statt mit DataSets arbeiten möchtest.
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
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
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.