DataSet und Relationen



  • Nach bestandener (juhui) Prüfung 70-536 bin ich nun am üben für die 70-528. Da muss ich mich endlich mal mit Datenbanken befassen. Bisher habe ich nur mal etwas erstellt mit alles automatischen Bindungen.
    Nun erstellte ich ein DataSet mit 2 Tabellen als Übung, eine sollte eine CD-Liste sein mit dem Albumnamen (als Schlüssel) sowie Künstlernamen, und die 2. enthält den Albumnamen sowie Tracks, so dass darin alle Rows den Namen eines Tracks und das dazugehörende Album enthalten.

    Nun komme ich nicht weiter wie ich auf die Tracks zugreifen kann; insbesondere wie ich sie zur Laufzeit eingeben kann. Auslesen sollte mit GetParentRow/GetChildRows kein Problem sein, doch ich schaffte es nicht über die Fremdschlüsselbeziehung auf die dazugehörige Track-Row zuzugreifen!

    Es ist eine BindingSource vorhanden und ein BindingNavigator mit welchem die Alben durchgegangen werden können sowie eine TextBox in die jeweils ein hinzuzufügender Track eingegeben werden sollte.

    Wie muss ich das realisieren?

    Es funktioniert irgendwie nicht ganz wie in den Beispielen, aber von Schreiben war auch nie die Rede, nur von auslesen.

    Vielen Dank!

    Das Dataset heisst CDsDataSet1 und enthält die Tables CDs und Tracks welche CDsRows und TrackRows enthalten; die CDsRows kann ich auf diese Weise setzen:

    cDsDataSet1.CDs.AddCDsRow("Evocation 1", "Eluveitie");
    cDsDataSet1.CDs.AddCDsRow("Invaders...", "The Prodigy");
    

    bei den TrackRows kommt da aber etwas von DataRowBuilder oder CDsDataSet.CDsRow welche als Argumente verlangt werden, selbst wenn ich nicht über die Relation zugreifen möchte; schaffe also beides nicht, indirekt und direkt nicht.



  • Hi,

    wenn Du nicht über die Relation zugreifen möchtest, kannst Du die neue CDsDataSet.TracksRow auch einfach mit

    CDsDataSet.TracksRow newRow = cDsDataSet1.Tracks.NewTracksRow();
    

    erzeugen und den Schlüsselwert "manuell" setzen

    newRow.Album = album; // string album; irgendwo voher!
    

    Aber eigentlich solltest Du ja die ParentRow aus CDs haben. Da Du den Album-Titel hast und dieser der Primärschlüssel ist, kannst Du die ParentRow natürlich auch per

    CDsDataSet.CDsRow parentRow = cDsDataSet1.CDs.FindByAlbum(album);
    

    ermitteln.

    Hoffe das hilft Dir weiter, sonst hab' ich Dein Prob nicht verstanden.

    Grtz,
    Qweety.



  • Vielen Dank; das Problem ist folgendes:
    bei

    CDsDataSet.TracksRow newrow = new CDsDataSet.TracksRow();
    

    kommt:
    Keine Überladung für die TracksRow-Methode nimmt 0 Argumente an.

    Es wird ein DataRowBuilder erwartet (versuchte ich zu instanzieren aber erfolglos, hat keinen Konstruktor).

    Ausserdem ist auch die Methode cDsDataSet1.CDs.FindByAlbum nicht vorhanden.
    Liegt das daran dass das DataSet nicht stark typisiert ist?



  • Ok, ich habe das DataSet im VS mit dem Designer zusammengestellt und das so nachvollzogen.

    Wenn dann FindByAlbum fehlt, hast Du die Spalte album nicht als Primärschlüssel gesetzt.

    DataRowBuilder ist nach meiner Doku irgendwas .NET-internes.

    Hmmm ... da muss ich denn nochmal schauen, wie man typisierte DataSets ohne dem erstellt, um Dein Problem nachzuvollziehen.



  • Ach so, schaue ich nochmals wie ich den Schlüssel gemacht habe.
    Es gibt ja viele Varianten ein DataSet zu erstellen; ich hatte bei meinen ersten Datenbank-Experimenten ein voll typisiertes DataSet, bei welchem dann zum Formular das DataGridView, BindingNavigator etc. hi9nzugefügt wurden; das passierte diesmal nicht; ich konnte das Datenquellen-Fenster auch nicht benutzen da ich keine Datenquelle angeben konnte (.mdf-Datei wollte es nicht, ich habe SQL Server auf dem Netbook nicht installiert).
    Habe sowieso noch ein paar Fragen wie das in der Praxis gehandhabt wird mit den Datenquellen; sollten .mdf-Dateien auch funktionieren wenn SQL-Server nicht installiert ist?

    So nun versuchte ich; habe den Primärschlüssel gesetzt; nur wenn ich nun zur Tracks-Tabelle etwas hinzufügen möchte mit AddTracksRow(newRow) erhalte ich eine Exception: Für ForeignKeyConstraint FK_CDs_Tracks müssen die untergeordneten Schlüsselwerte (The Prodigy) in der übergeordneten Tabelle vorhanden sein.... (ist in der CDs-Tabelle aber vorhanden).


Anmelden zum Antworten