Fremdschlüssel aus DataSet auslesen

  • VB.NET

Es gibt 65 Antworten in diesem Thema. Der letzte Beitrag () ist von hoobeN.

    Fremdschlüssel aus DataSet auslesen

    Hallo,

    weiß jemand zufällig, ob und wie es möglich ist, einem DataSet seine fremdkeys abzufragen? ich habe ein relativ komplexes datenbankmodell erstellt mit sehr vielen referenzen.
    Jetzt ist mein Vorhaben, dass sobald ich eine Abfrage feuer á la "SELECT * FROM x" und diese Tabelle einen fremdschlüssel enthält, eine schleife startet, die die nächste abfrage automatisch mit in das dataset schreibt, quasi "SELECT * FROM 'tabelle des fremdschlüssels' WHERE primarykey = 'fremdschlüssel aus der letzten tabelle'"
    und sich dieser vorgang wiederholt, bis alle referenzen ausgelutscht sind.

    hoffentlich versteht jemand, was ich möchte und kann mir helfen!
    Danke!
    soweit ich sehe, hat sone Abfrage was mit sql zu tun, also mitte DB - nicht mittm Dataset.

    Beim Dataset gibts einfach die Methode GethildRows, die alle ChildRows gettet.

    Und beim typisierten Dataset gibts das natürlich typisiert, also wenn eine Tabelle Kunde besteht, und eine Tabelle Bestellung, dann hat das typisierte Dataset auch die Methode

    VB.NET-Quellcode

    1. KundeRow.GetBestellungRows() As BestellungRow()


    Aber vmtl. willst du Sql schreiben, welches geeignet ist, KindRows und KindesKind-Rows ins datasset zu laden.

    Sowas ist in [VB 2008] DBExtensions allgemeingültig gelöst.

    (Naja - es sind glaub noch Datenmodelle denkbar, für die evtl. noch nachgebessert wern muß)
    Ich danke dir! Das sieht ja schon mal nach was aus!
    aber wie genau führe ich die Connection Function aus?! Bekomme immer "Eine nicht behandelte Ausnahme des Typs "System.NullReferenceException" ist in DBExtensions.dll aufgetreten.

    Zusätzliche Informationen: Object reference not set to an instance of an object."

    sorry, bin ein anfänger ._.
    Kannst du mir vielleicht beantworten, warum das nicht geht? Ich dachte es gibt volle SQL unterstützung!
    Das klappt jedenfalls gar nicht, kommt immer Syntax-Fehler bei FROM-Klausel... :(

    VB.NET-Quellcode

    1. Private Sub Suche()
    2. Dim condition = "WHERE M_Vorname = ? AND M_Name = ?"
    3. If txtNname.Text = "" And txtVname.Text = "" Then
    4. MsgBox("Bitte geben Sie einen Suchbegriff ein!")
    5. Exit Sub
    6. ElseIf txtNname.Text = "" Then
    7. condition = "WHERE M_Vorname = ?"
    8. myDataSet.Mitarbeiter.Fill(condition, txtVname.Text)
    9. ElseIf txtVname.Text = "" Then
    10. condition = "WHERE M_Name = ?"
    11. myDataSet.Mitarbeiter.Fill(condition, txtNname.Text)
    12. Else : myDataSet.Mitarbeiter.Fill(condition, txtVname.Text, txtNname.Text)
    13. End If
    14. Fillrest()
    15. End Sub
    16. Private Sub Fillrest()
    17. Dim condition2 = "INNER JOIN Mitarbeiter ON ID = M_Standorte WHERE M_Name = ? AND M_Vorname = ?"
    18. myDataSet.Standorte.Fill(condition2, txtNname.Text, txtVname.Text)
    19. End Sub
    hmm.

    Also von "Suche" täte ich erwarten, dasse größtenteils funktioniert, nur Fillrest verstehe ich nicht.
    Mir scheint, du willst dort die zu den Mitarbeitern passenden Standorte laden, aber deine Abfrage befüllt die Mitarbeiter-Tabelle (oder versucht es wenigstens).

    Anneres ist ein logisches Problem: Du kannst nicht erst Mitarbeiter einbefüllen, wenn deren übergeordnete Standorte im Dataset noch nicht geladen sind.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Na - ist doch super!
    Damit hast du ja bereits alle Standorte und Mitarbeiter im Dataset, und brauchst keine weitere Query an die DB zu richten.

    du kannst dir einen JoiningView auf Mitarbeiter basteln, bei dem die Joining-ComboColumn den Standort-Namen in die Mitarbeiter-Sicht hinein-joint.
    Bei der zugehörigen MitarbeiterBindingSource kannstedann bequem einen Filter setzen.
    gugge nach JoiningView auf die vier Views (WinForms)
    Danke, das funktioniert bestens!

    Hab da aber noch eine Frage. Und zwar:
    Ich suche ja nur über Namen und bekanntlich kommen die auch mal doppelt, bzw. dreifach etc. vor. Ist es möglich dem Programm zu sagen
    "wenn du zwei mit dem gleichen namen findest, dann stelle eine auswahl der beiden zur verfügung"?
    ich weiß jetzt nicht, was du implementiert hast.
    Aber wenn ein Filter auf Name gesetzt ist, zeigt das DGV türlich alle an, deren Name matcht (DataExpressions unterstützen übrigens auch einen Like-Operator)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    dann weißich ühaupt nicht, wovon du sprichst, wenn du sagst "funktioniert bestens" - ich bezog das auf mein Vorschlag in post#10 mittm BindingSource-Filter.

    Zu Filter gugge DataExpressions

    Und natürlich kannst du in einer Textbox keine auswahl anzeigen. Das geht besser im DGV (bitte jetzt nicht anfangen, und dynamisch Textboxen generieren).

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    gehen tut alles.
    Kannst ein Such-Ergebnisfenster machen, und aus den Ergebnissen sucht der User eines aus, und dann kann man mw. den original-Filter umsetzen auf einen Filter, der nur dieses Ergebnis findet - sprich: auf einen Filter nach ID.

    eine Möglichkeit.

    aber ich zweifel, ob son Workaround notwendig ist, und frage, obs die Useability verbessert oder verschlechtert.

    vlt. kommt dir noch am besten entgegen, gleich ein Such-Fenster (inklusive Filter-Textbox) zu machen statt nur die Such-Ergebnisse.

    Weil sonst ist da letztlich ein Such-Ausdruck angezeigt - gefiltert wurde aber auf was anneres (nämlich auf ID)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Ich habe noch eine Frage, könnte aber bisschen kompliziert werden.
    Und erst Mal möchte ich dir sagen, dass jetzt fast(!) alles so funktioniert, wie es sollte.
    Meine Tabelle Mitarbeiter referenziert sich selbst (d.h. es gibt für manche Mitarbeiter auch einen Ersatz und da der Ersatz nun mal auch ein Mitarbeiter ist, wäre es ja quatsch noch eine Zweite Tabelle Mitarbeiter zu machen, die denselben content hat, wie die erste).
    Also jedenfalls verweist also Ersatz auf seine eigene Tabelle und zwar auf die ID.
    Das funktioniert soweit auch ganz super, aber ich kann um Gottes Willen den Namen dieses Ersatzes nicht Abfragen, a) kann Access keine variablen wie mir scheint (ich bekomme zumindest immer einen Fehler, wenn ich 'DECLARE @temp int' machen will) und b) funktioniert 'SELECT Name FROM Mitarbeiter WHERE ID = Ersatz' auch nicht wirklich, weil es keinen Datensatz gibt, wo ersatz = id ^^

    ich hoffe du hast mein problem einigermaßen verstanden und kannst mir irgendwie weiterhelfen.

    LG

    Achja...und mit Subselects hab ichs auch probiert, aber auch das will nicht wie ich -.-'
    bist du schon wieder in der Datenbank unterwegs, wo du die Daten doch bereits im Dataset hast?

    guck dir unbedingt im ObjektKatalog mal an, welche Features alle dir das Dataset an deine Datenklassen hingeneriert hat.

    Hast du eine Tabelle "Mitarbeiter" mit einer Spalte "Ersatz" als Fremdschlüssel auf die eigene Tabelle, dann ist alles erledigt.

    Das Dataset hat dir eine Property MitarbeiterRow.Ersatz As MitarbeiterRow hingeneriert, du mußt das nur wissen - daher nochmal: ObjektKatalog!!
    Ja, ich hab in den Katalog geschaut, aber bin ich leider noch zu unerfahren, als dass ich wüsste, was mit dem gelesenen anzufangen ist -.-'
    (ich treibe dich langsam zur weissglut, oder? :D)

    Achja und das habe ich übrigens nicht erwähnt: Ich will einen Mitarbeiter mit all seinen Daten abbilden (das funktioniert ja auch wunderbar) + in einem Extrafeld soll gleichzeitig der Name des Ersatzes stehen, ich glaube das ist das eigentliche Problem, weil auch die DB nur auf die ID referenziert.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „hoobeN“ ()