Announcement

Collapse
No announcement yet.

Objektorientierung in Datenbankanwendung - Diskussion

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Objektorientierung in Datenbankanwendung - Diskussion

    Hallo zusammen,

    ich würde mit diesem Thread gerne eine Diskussion über die Entwicklung von streng objektorientierten Datenbankanwendungen (relationale Datenbanken).

    Ich entwickle gerne objektorientiert, mit "realweltlichen" Klassen usw. Insbesondere bei Simulationen/technischen Anwendung geht das ja schön.

    Aber wenn es dann darum geht, eine ordentliche Datenbankanbindung hinzubekommen, und das auch noch elegant, einfach, und performant bei nicht-pipifax-beispiel-Anwendungen... naja.

    Ein Persistenz-Framework ist mir bisher nicht zwischengekommen.

    Wie macht ihr es? Oder weicht ihr auch wie so viele der Einfachheit (und Zeit)halber vom "Pfad der Tugend" ab?

    Ich würde mich sehr über zahlreiche Antworten und einen befruchtenden Ideenaustausch freuen...

    Bodo

  • #2
    Hallo,

    ... streng objektorientierten Datenbankanwendungen ...
    in der "Bibel" zu diesem Themengebiet (Martin Fowler: Patterns of Enterprise Application Architecture ) werden die folgenden 3 zulässigen Pattern beschrieben.
    • Table Data Gateway
    • Row Data Gateway
    • Data Mapper (zuzüglich der abgespeckten Fassung Active Record)


    Übersetzt man das in die .NET-Welt, so stehen die folgenden Techniken zur Verfügung:
    • ab .NET 2.0: Der TableAdapter implementiert das Table Data Gateway
    • ab .NET 3.5: LINQ to SQL implementiert den Active Record
    • als Nachsatz zu .NET 3.5: LINQ to Entities (alias ADO.NET Entity Framework) implementiert einen Data Mapper


    Es gibt selbstverständlich einen Grund für diesen "Technologie-Wildwuchs". Denn jede dieser Techniken adressiert einen bestimmten Anforderungskontext. Das .NET Framework kümmerte sich zuerst um die typischen Szenarien (... Mainframe...) und rüstet erst Schritt für Schritt die "Exoten" nach. Am Ende (also im 1. Halbjahr 2008) kann der Entwickler die Technologie auswählen, die für sein konkretes Projekt am Besten geeignet ist.

    .. und performant bei nicht-pipifax-beispiel-Anwendungen ...
    Dann schließt das einen Data Mapper vom Prinzip her schon einmal aus, so dass nur die beiden anderen Alternativen übrig bleiben ;-)

    Die Idee eines Object-oriented Database Management Systems (OODBMS) ist inzwischen 17 Jahre alt und darf daher als völlig gescheitert betrachtet werden. Der 1998 gestartet 2. Versuch (Scott Ambler „Mapping Objects to Relational Databases“) hat sich bis Heute immer noch nicht flächendeckend durchgesetzt, weil es gewisse "störende" konzeptionelle Unterschiede zwischen einer mengenorientierten relationalen Datenbank und einem Instanzbezogenen OOP-Modell der Anwendung gibt. Allein die Tatsache, dass es inzwischen mehr als 30 verschiedene O/R-Mapper (davon viele als OPEN SOURCE-Projekte) gibt, macht doch die Nebenwirkungen deutlich. Nicht ohne Grund hatte Microsoft die ObjectSpaces nach der Beta-Phase aus dem .NET 2.0 Framework wieder herausgeworfen.

    Wie macht ihr es?
    Ich nutze den Weg, der Heute am Besten in die Entwicklungsumgebung Visual Studio 2005 integriert ist: die TableAdapter.

    Oder anspruchsvoller formuliert: "Ich implementiere in meinen dreischichtigen Datenbankanwendungen das Table Data Gateway-Pattern" ;-)
    Zuletzt editiert von Andreas Kosch; 06.05.2007, 09:11.

    Comment


    • #3
      Hallo!

      Wie sieht so ein "Table Data Gateway-Pattern" aus?

      mfg
      Thomas

      Comment


      • #4
        Interessant, kannte ich noch nicht.

        Wie schaut das genau aus?

        Kann ich mir das so vorstellen, dass der TableAdapter eine Art Container ist, der eine Liste aller Objecte sagen wir von der Klasse Person enthält? Erzeugt dieser Container "TableAdapter" die entsprechenden Objekte der Klasse Person?

        Und wie siehts dann aus mit Relationen zwischen Objekten?

        Comment


        • #5
          Hallo,

          der von Visual Studio 2005 über den DataSet Designer im Hintergrund automatisch zusammengebaute TableAdpater ist "nur" die Kombination eines typisierten DataSets mit einem typisierten DataAdapter. Die Daten werden in DataTable-Instanzen gespeichert, die über DataRelation-Instanzen miteinander verbunden sind. Da nun ab .NET 2.0 auch der DataAdapter streng typisiert ist, werden die Anforderungen des Table Data Gateway-Patterns erfüllt.

          Comment


          • #6
            Problem mit dem Insert Command

            Ich bekomme die Fehlermeldung "Syntaxfehler in der INSERT INTO-Anweisung".
            Das ist mein Programmcode. Ich hoffe jemand kann mir helfen..

            Public Class Rechnung
            Dim MyConn As OleDb.OleDbConnection = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLED B.4.0; " & "Data Source=" & Application.StartupPath & "\KundenDaten.mdb")
            Dim daRechnung As OleDb.OleDbDataAdapter
            Dim tbRechnung As DataTable
            Dim dbPosition As Integer
            Private Sub Rechnung_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


            Kunden.RechnungFüllen()
            dbPosition = 0
            DatenbankverbindungHerstellen()
            End Sub

            Public Sub DatenbankverbindungHerstellen()
            '*0* verbindung zur Datenbank wird geöffnet
            MyConn.Open()

            '*1* Tabellen erzeugen
            tbRechnung = New DataTable()

            '*2* DataAdapter für Tabelle tbRechnung erzeugen
            daRechnung = New OleDb.OleDbDataAdapter("SELECT * FROM Rechnungen", MyConn)

            '*3* Die Tabelle schüler wird befüllt
            daRechnung.Fill(tbRechnung)

            '*4* Commands für DataAdapter erzeugen
            Dim cb As New OleDb.OleDbCommandBuilder(daRechnung)
            daRechnung.InsertCommand = cb.GetInsertCommand()
            daRechnung.UpdateCommand = cb.GetUpdateCommand()
            daRechnung.DeleteCommand = cb.GetDeleteCommand()
            End Sub

            Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Me.Close()
            End Sub

            Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            SpeichernNeu()
            daRechnung.Update(tbRechnung)
            MsgBox("Es wurde Gespeichert!")
            End Sub

            Public Sub SpeichernNeu()

            tbRechnung.Rows.Add()
            dbPosition = tbRechnung.Rows.Count - 1

            tbRechnung.Rows(dbPosition).Item("Vorname") = TextBox1.Text
            tbRechnung.Rows(dbPosition).Item("Familienname") = TextBox2.Text
            tbRechnung.Rows(dbPosition).Item("Straße") = TextBox3.Text
            tbRechnung.Rows(dbPosition).Item("PLZ") = TextBox4.Text
            tbRechnung.Rows(dbPosition).Item("Ort") = TextBox5.Text
            tbRechnung.Rows(dbPosition).Item("Stammkunde") = CheckBox2.Checked
            tbRechnung.Rows(dbPosition).Item("Rechnungsnummer" ) = TextBox6.Text
            tbRechnung.Rows(dbPosition).Item("Produktbezeichnu ng") = TextBox7.Text
            tbRechnung.Rows(dbPosition).Item("Preis exkl ust") = TextBox8.Text
            tbRechnung.Rows(dbPosition).Item("20% ust") = TextBox9.Text
            tbRechnung.Rows(dbPosition).Item("Preis inkl ust") = TextBox10.Text

            End Sub
            End Class

            lg zijad

            Comment


            • #7
              Hallo,

              es wäre besser gewesen, die Frage als neuen Beitrag anzulegen...

              Ich bekomme die Fehlermeldung "Syntaxfehler in der INSERT INTO-Anweisung".
              Die Klasse OleDbCommandBuilder gehört nicht ohne Grund in den "Giftschrank". Denn der Entwickler verliert völlig die Kontrolle über die später zur Laufzeit ausgeführten Anweisungen. Da die INSERT-Anweisung erst zur Laufzeit generiert wird, ist die Fehlerursache im Quelltext unsichtbar!

              Wenn man den von Visual Studio vorgesehenen Weg beschreitet, definiert das typisierte DataSet die SQL-Anweisungen bereits zur Entwicklungszeit. Außerdem wird auch die Datenbindung völlig visuell konfiguriert, so dass sich auch die Anzahl der von Hand zu schreibenden Programmzeilen (und somit die Wahrscheinlichkeit von Fehlern) drastisch verringert.

              Comment


              • #8
                hey..
                danke für deine analyse..

                aber kannst du mir sagen wie ich den fehler beheben kann ?!

                Außerdem hab ich diesen fehler bereits bei einer anderen Datenbank gehabt, diesen habe ich jedoch durch das ersetzen der DB durch eine neue behoben. Doch jetz hab ich das auch probiert, uns siehe da..
                der fehler ist noch immer da..


                lg zijad

                Comment


                • #9
                  Hallo,

                  ..wie ich den fehler beheben kann ?!
                  ganz einfach: Indem die Komponente OleDbCommandBuilder aus dem Projekt entfernt wird. Statt dessen übernimmt der OleDbDataAdapter (oder noch besser: der von Visual Studio 2005 generierten TableAdapter) die Aufgabe.

                  Comment

                  Working...
                  X