Relations in DataSet - These columns don't currently have unique values

  • VB.NET
  • .NET 5–6

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von lop001.

    Relations in DataSet - These columns don't currently have unique values

    Hallo,

    Nach vielem Suchen finde ich derweil keine Lösung für mein Probleem bzw. muss ich den Ansatz Überdenken.

    Ich habe zwei Tabellen in einem DataSet (Tabelle1 = Rep, Tabelle2 = Benutzer) und möchte unter .net 6 eine Relation herstellen.

    Das Herstellen von Relationen klapp im Grunde wenn ich dies jeweils über die Primärschlüssel mache.

    Dim Rep_Ut2 As DataRelation
    Rep_Ut2 = New DataRelation("Rep_Ut2", DataSetRepertoire.Tables(Rep).Columns("ID"), DataSetRepertoire.Tables("Benutzer").Columns("ID_Benutzer"))
    DataSetRepertoire.Relations.Add(Rep_Ut2)


    Nun habe ich jedoch Tabelle1 die eine Spalte enthält mit den Namen der Benutzer. Der Benutzer kann mehrfach in dieser Spalte vorkommen.

    Wenn ich eine Relation herstelle erhalte ich immer die Fehlermeldung "These colums dont't currently have unique values".

    Hier der verwendete Code

    Dim Rep_Ut2 As DataRelation
    Rep_Ut2 = New DataRelation("Rep_Ut2", DataSetRepertoire.Tables(Rep).Columns("Benutzer"), DataSetRepertoire.Tables("Benutzer").Columns("ID_Benutzer"))
    DataSetRepertoire.Relations.Add(Rep_Ut2)


    Würe mich über einen Lösungsansatz freuen.

    Mit freundlichen Grüssen
    Hallo,

    Super danke, ich muss gestehn arbeite mich erst in die Thematik ein, und hatte jetzt alles per Code gelöst.

    Wenn ich mir meine Dataset über Fill angelegt habe konnte ich auf die Werte der Tabelle zugreifen über DataSet.Tables("××")

    Wenn das Dataset jedoch über den Designer erstellt wird scheint dies nicht zu klappen.

    Mit freundlichen Grüssen
    Der Designer macht nur die Struktur, Daten können nur zur Laufzeit enthalten sein.
    Du musst also weiterhin das DataSet instanzieren und Daten einlesen.

    Der Unterschied ist, dass das jetzt sehr viel stärker typisierte Klassen sind. Am besten du gibst mal vor wie du dein DataSet bisher im Code erstellst, dann kann man dir das besser erklären.
    Und ein Bild vom DataSet, das du jetzt im Designer angelegt hast. (Bild einfügen machst du unter Erweiterte Antwort, Reiter Dateianhänge -> Hochladen)
    Hallo,

    Zunächst danke für die Unterstützung.

    Bis jetzt habe ich mir das Dataset folgendermassen angelegt. Jeweils ein DataAdapter zu einer Tabelle aus Access erstellt und dann das Dataset befüllt (sieh Bild). Anschliessend habe ich die Abhängigkeiten manuel geschrieben wie oben erwähnt.

    Jetzt habe ich das Dataset im Desinger entworfen (siehe Bild) und die Abhängigkeiten vorgeben.

    Mit freundlichen Grüssen
    Bilder
    • Code.PNG

      135,55 kB, 979×663, 144 mal angesehen
    • dataset.PNG

      20,34 kB, 805×465, 146 mal angesehen
    • dataset1.PNG

      21,27 kB, 667×590, 141 mal angesehen
    Willkommen im Forum.

    Auf die Tabellen kannst Du über die konkreten Bezeichnungen zugreifen. Also: keine Strings verwenden, sondern den Tabellennamen angeben: DeinDataSet.Repertoire2023
    z.B.

    VB.NET-Quellcode

    1. For Each Repertoire in DeinDataSet.Repertoire2023
    2. MessageBox.Show(Repertoire.Concerne)
    3. Next


    btw: Am besten die Benennung aller Tabellen und Spalten vereinheitlichen: deutsch, französisch und ggf. englisch gleichzeitig kann den den Leser ziemlich in die Irre führen. Und der Hauptleser bist Du selbst.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo,

    Und danke für die Antwort. Jedoch scheint dies nicht zu funktionnieren (siehe Bild).

    Wie gesagt, bis jetzt ohne den Designer konnte ich problemlos auf die Tables über den String zugreifen.

    Wenn ich die direkte Adressierung nutze klappt dies nicht. Das einzige was vb.net vorgibt ist dts_Repertoire.Repertoire2023DataTable.

    Mit freundlichen Grüssen,
    Bilder
    • Capturesds.PNG

      6,85 kB, 546×91, 142 mal angesehen
    Nun, solange Du keine tDS-Instanz auf dem Form hast, klappt das nicht. Eine (tDS-)Klasse ist keine (tDS-)Instanz. Ein Bauplan eines Hauses lässt sich nicht bewohnen.
    In einem anderen Thread habe ich angegeben, wie Du die tDS ins Form bekommst.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo,

    Danke für die Antwort. Ich habe mir jetzt den anderen Thread angeschaut und eine Test-Datei erstellt. Leider bekomme ich es nicht gebacken.

    Sämtliche Schritte umgesetzt den Dtg kann iech auch dir Tabelle zuweisen, jedoch im Form1 kann ich die Tabellen aus dem DataSet nicht wie beschrieben Adressieren.

    Mit freundlichen Grüssen,
    Bilder
    • Capture2.PNG

      48,12 kB, 1.585×715, 140 mal angesehen

    lop001 schrieb:

    kann ich die Tabellen aus dem DataSet nicht wie beschrieben Adressieren.
    Was ist Dein Versuch?
    Bei Deinen Bildern müsste es wohl z.B. lauten:

    VB.NET-Quellcode

    1. For Each Repertoire in DataSet11.Repertoire2023
    2. MessageBox.Show(Repertoire.Concerne)
    3. Next
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Bitte richtig lesen: DataSet11 - elf, nicht eins.
    Das ist Deine Entscheidung gewesen: Siehe Dein Bild in Post#11, unten links
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo,

    Danke für die Unterstützung. Ich war etwas verwirrt denn im Explorer steht DataSet1, im Form steht tatsächlich die DataSet11.

    Dat Füllen müsste ich ja nun über den erzeugten DataTableAdapter machen wenn ich das richtig verstehen. Den Adapter habe ich mir vorher selbst erstellt. Leider weis ich nicht wie ich den erzeugten TabelAdapter anwenden muss zum füllen des Datasets.

    Mit freundlichen Grüssen

    lop001 schrieb:

    Ich war etwas verwirrt denn im Explorer steht DataSet1, im Form steht tatsächlich die DataSet11.
    Ja, denn Dein tDS (typisiertes DataSet) trägt den Klassennamen DataSet1. Wenn man davon im Designer eine Instanz erzeugt, hängt Visual Studio bei der ersten Instanz eine 1 dran. So wird aus der Klasse Button die Instanz mit dem Namen Button1 und aus der Klasse DataSet1 eben eine Instanz namens DataSet11. Eine zweite tDS-Instanz hieße dann automatisch DataSet12. Daher ist es immer sinnvoll, sich um die Benennungen der Controls und Klassen zu kümmern, bevor VS zuviel unklaren Quark produziert. Aber hey, woher soll es VS auch besser wissen?

    Bei den TableAdaptern bin ich raus. Das kann wohl u.a. @ErfinderDesRades beantworten, der hiermit angepingt wurde und es wahrscheinlich demnächst liest.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Was du bisher getan hast:
    Wie erstelltest du dein DataSet zuvor? Vermutlich so:
    Dim DataSetRepertoire = New DataSet
    DataSet ist die Klasse DataSetRepertoire eine Instanz davon.

    Im Designer hast du dir eine Klasse DataSet1 gebaut. Benenne diese um, das hilft, z.B. in "DataSetRepertoireClass"
    Dann kannst du nun analog im Code schreiben
    Dim DataSetRepertoire = New DataSetRepertoireClass

    Durch diesen Schritt nutzt du nun, was du im Designer erstellt hast, dein Code sieht aber trotzdem fast gleich aus wie zuvor.
    Der Unterschied DataSetRepertoire ist in der zweiten Version stärker typisiert.

    Als nächstes fülltest du deine Tabellen zuvor so:
    da_Repertoire.Fill(DataSetRepertoire, Repertoire)

    Das würde mit dem neuen DataSetRepertoire dann so aussehen:
    da_Repertoire.Fill(DataSetRepertoire.Repertoire)

    Du siehst die Unterschiede sind bisher kaum bemerkbar, aber der Kicker ist die Relationen musst du jetzt gar nicht mehr coden, sondern kannst sie designen.

    Schau ruhig hier, da ist das nochmal detaillierter geschildert:
    learn.microsoft.com/en-us/visu…typed-vs-untyped-datasets

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Hallo,

    Perfekt, danke für sämtliche Erläuterungen. Insebsondere der letzte Verweis auf die Klasse hat einiges erleichtert.

    Auch die gesamten Erläuterungen zu dem Erstellen der DataSets über den Designer waren sehr hilfreich.

    Das ursprüngliche Problem konnte ich durch dieses Vorgehen tatsächlich beheben.

    Mit freundlichen Grüßen