Autor Beitrag
Vitalic
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 68



BeitragVerfasst: Di 01.11.11 20:33 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: 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.

user profile iconVitalic hat folgendes geschrieben Zum zitierten Posting springen:
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.
user profile iconVitalic hat folgendes geschrieben Zum zitierten Posting springen:

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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 68



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mi 02.11.11 00:34 
user profile iconVitalic hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 68



BeitragVerfasst: 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
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 03.11.11 00:21 
Wenn du den Beta-EF-Treiber von Oracle nicht ausprobieren möchtest, gäbe es immer noch NHibernate.

_________________
>λ=
Vitalic Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 68



BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 68



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Mo 07.11.11 18:36 
Hallo Vitalic,

warum benutzt Du den Tableadapter auch so? Probiere es mal so:
ausblenden 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