Entwickler-Ecke
WinForms - Datenbankobjekte
Vitalic - Di 01.11.11 20:33
Titel: Datenbankobjekte
Hallo alle zusammen, ich arbeite momentan an einer Oracle Datenbank und habe ein Problem.
Bisher habe ich immer die SQL-Statements für die Kommunikation zwischen der Datenbank und dem Programm geschrieben, jedoch ist solch eine Vorgehensweise sehr anfällig, da man sehr viele Fehler im String machen kann.
Nun gibt es bestimmt eine Möglichkeit, die es mir erlaubt die Datenbank im Projekt einzubinden und eine oder mehrere Klassen für die Datenbank zu generieren.
DataSet ist wohl eine Möglichkeit wie man aus einer Datenbank die Tabellen-Klassen generieren kann.
Leider kenne ich mich damit nicht aus und habe bisher noch keine Beispiele gefunden, wie man über diese generierten Klassen auf die Datenbankdaten zugreift oder diese bearbeitet.
Ebenso würde ich gerne erfahren, wie sich der generierte Quellcode verhält, wenn in der Datenbank z.B. neue Felder hinzukommen. Wird dieser automatisch aktualisiert?
Vielleicht ist aber auch DataSet hierfür nicht geeignet, da dies keine lokale Datenbank ist und Ihr eine andere Möglichkeit kennt, wie man mein Problem lösen könnte.
Mit freundlichen Grüßen
Vitalic
Trashkid2000 - Di 01.11.11 21:37
Hallo Vitalic,
anstelle eines DataSets gibt es auch noch andere O/R-Mapper (z.B. Linq2Sql, Entity Framework,...), die je nach Anwendungszweck verwendet werden können. Wahrscheinlich hat alles seine Vor-und Nachteile.
Aber ich persönlich arbeite auf Arbeit mit dem Entity Framework (4.0) und bin damit sehr zufrieden.
Vitalic hat folgendes geschrieben : |
| Ebenso würde ich gerne erfahren, wie sich der generierte Quellcode verhält, wenn in der Datenbank z.B. neue Felder hinzukommen. Wird dieser automatisch aktualisiert? |
Da dürften sich alle Mapper gleich verhalten: Der generierte Quellcode kriegt nichts von der Änderung in der Datenbank mit. Er muss also bei jeder Änderung (manuell) neu generiert werden.
Vitalic hat folgendes geschrieben : |
Vielleicht ist aber auch DataSet hierfür nicht geeignet, da dies keine lokale Datenbank ist und Ihr eine andere Möglichkeit kennt, wie man mein Problem lösen könnte. |
Ob nun lokal oder nicht, das macht eigentlich keinen großen Unterschied!
Kannst Dich ja einfach mal in die versch. Sachen einlesen.
LG, Marko
Vitalic - Di 01.11.11 22:03
Hallo Trashkid2000 und danke für deine Antwort!
Vielleicht hast du ein einfaches Beispiel, welches einen Datensatz in die Datenbank reinschreibt und eins welches das ganze wieder ausliest? Denn man muss ja vorher die Daten irgendwie aus der Datenbank auslesen, bevor man damit arbeiten kann.
Unterstützt Linq2Sql auch die Datenbank Oracle?
Mit freundlichen Grüßen
Vitalic
Yogu - Mi 02.11.11 00:34
Vitalic hat folgendes geschrieben : |
| Ebenso würde ich gerne erfahren, wie sich der generierte Quellcode verhält, wenn in der Datenbank z.B. neue Felder hinzukommen. Wird dieser automatisch aktualisiert? |
Das angesprochene Entity Framework bietet einen Ansatz (
EMF Code First), der gerade anders herum funktioniert: Du schreibst dir die Datenbank-Models als Klassen und das Framework erstellt dir die passende Datenbank. Ändern sich die Klassen, wird die Datenbank automatisch neu erstellt; wenn man es richtig anstellt, werden die Daten dabei behalten.
Edit: Das heißt nicht, dass es nicht anders geht: Die beiden anderen Ansätze des Entity Frameworks stellen das Model oder auch die fertige Datenbank an den Anfang.
Vitalic - Mi 02.11.11 10:37
Hallo,
leider habe ich nun das Problem, dass man das Entity Data Model nicht mit Visual Studio 2008 und Oracle Datenbank nutzen kann.
Gibt es da vielleicht noch eine andere Möglichkeit, ohne Installation von diversen Programmen?
Mit freundlichen Grüßen
Vitalic
Vitalic - Fr 04.11.11 15:28
Hallo und Danke für die Hilfe!
Ich habe das Ganze mal mit DataSet gelöst und es scheint auch zu funktionieren.
Nur habe ich ein kleines Problem, wenn ich mehrere Daten in einer Schleife (ca. i = 150) über den dataAdapter lösche oder einfüge.
Über die normalen SQL-Statements geht das Ganzeviel schneller.
Nun habe ich auch herausgefunden, warum es zu dieser Wartezeit kommt (siehe finally).
Meine Schleife:
C#-Quelltext
1: 2: 3: 4: 5:
| foreach (var result in themaQuery) { _dataAdapter.Delete(result.Daten_ID, result.Benutzer_ID, result.Liste, result.Thema, result.Anzahl, result.Datum); pBar.PerformStep(); } |
Generierter Code:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| public virtual int Insert(global::System.Nullable<int> Benutzer_ID, string Liste, string Thema, global::System.Nullable<int> Anzahl, string Datum) { ... finally { if ((previousConnectionState == global::System.Data.ConnectionState.Closed)) { this.Adapter.InsertCommand.Connection.Close(); } } } |
Frage: Darf man den finally-Block löschen?
Mit freundlichen Grüßen
Vitalic
Ralf Jansen - Fr 04.11.11 15:45
| Zitat: |
Frage: Darf man den finally-Block löschen?
|
Es ist dein Code auch wenn der von VS generiert wurde. Mit dem kannst du machen was du willst. Hilft nur nicht dauerhaft da der generierte Code natürlich ab und an neu generiert wird.
Ich sehe auch nicht wie eine Änderung beim Insert beim Delete helfen soll? Und das Offenhaltung der Connection halte ich im Normalfall auch für problematisch. Hast du den ConnectionPool ausgeschaltet? Bei ConnectionPooling sollte es performancemäßig eigentlich keinen Einfluß haben. Um das performancemäßig zu optimieren solltest du wenn du häufiger größere Mengen löscht eher auf ein anderes Verfahren umstellen als einfach entsprechend oft mit der Datenbank Kommunikations-Ping-Pong zu spielen (Also z.B mit einem 'Delete from Table where id in (langeListe)' oder ähnliches).
Was du da als _dataAdapter bezeichnest ist ein Tableadapter und kein DataAdapter oder?
Vitalic - Mo 07.11.11 10:26
Hallo
| Zitat: |
| Ich sehe auch nicht wie eine Änderung beim Insert beim Delete helfen soll? |
Beim Insert und Delete wird der selbe Code ausgeführt.
| Zitat: |
| Hast du den ConnectionPool ausgeschaltet? |
Mein ConnectionString beinhaltet keinen Poolingeintrag, also gehe ich davon aus, dass dieser aktiviert ist
| Zitat: |
| Was du da als _dataAdapter bezeichnest ist ein Tableadapter und kein DataAdapter oder? |
Es ist ein Tableadapter
| Zitat: |
Um das performancemäßig zu optimieren solltest du wenn du häufiger größere Mengen löscht eher auf ein anderes Verfahren umstellen als einfach entsprechend oft mit der Datenbank Kommunikations-Ping-Pong zu spielen (Also z.B mit einem 'Delete from Table where id in (langeListe)' oder ähnliches). |
Die Idee war doch, ohne die SQL-Statements zu arbeiten (siehe ersten Beitrag)
Mit freundlichen Grüßen
Vitalic
Ralf Jansen - Mo 07.11.11 12:34
| Zitat: |
| Die Idee war doch, ohne die SQL-Statements zu arbeiten (siehe ersten Beitrag) |
Ok. Ohne Hände schmutzig machen heißt dann leider auch mit gewissen Performanceeinschränkungen leben ;)
Generierten Code des Tableadapters ändern wollen aber nicht an dessen SQL rumspielen (wofür der explizit ausgelegt ist) ist aber dann auch irgendwie merkwürdig oder :?: .
Trashkid2000 - Mo 07.11.11 18:36
Hallo Vitalic,
warum benutzt Du den Tableadapter auch so? Probiere es mal so:
C#-Quelltext
1: 2: 3: 4:
| var dataSet = new DataSet1(); dataSet.TestTable.AddTestTableRow(Guid.NewGuid(), "Bla"); dataSet.TestTable.AddTestTableRow(Guid.NewGuid(), "Keks"); new TestTableTableAdapter().Update(dataSet.TestTable); |
Denn wie man im generierten Code sieht, schließt der DataAdapter die Connection nur, wenn sie vorher auch geschlossen war.
LG, Marko
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!