Fremdschlüssel aus DataSet auslesen

  • VB.NET

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

    no, die Lösung des Rätsels ist denkbar einfach: deine Suche sucht und findet alle gesuchten Mitarbeiter, und befüllt damit die Tabelle neu. Da sie aber maximal nur einen einzigen MA findet, enthält die Tabelle anschließend nur noch einen einzigen, und alle Auswahl-Funktionalität ist dahin, mangels Inhalten, aus dies was auszuwählen gibt.

    Ich denke, das Gui musste neu konzipieren, das ist ja unpraktisch und widersinnig.

    Mach doch den bescheuerten BindingNavigator weg, und biete dem User ein DatagridView an, aus dem er vernünftig jemanden auswählen kann - müssen ja nicht alle Spalten angezeigt sein.

    In die DB selbst kann ich leider nicht reingugge, wie per PN erwähnt, muß sichergestellt sein, dass die Beziehungen voll funktionstüchtig sind, also sog. "referenzielle Integrität" mit Löschweitergabe.

    DBExtensions setzt Löschweitergabe voraus, denn wenn man einen übergeordneten Datensatz löscht, hats keinen Sinn, seine untergeordneten in der DB verbleiben zu lassen.
    Unds ist unvergleichlich performanter, im Fallle der Löschung von aufeinander bezogenen Datensätzen nur die Löschung der übergeordneten Datensätze an die DB zu schicken, und das Kleinkram weghauen von der DB selbst erledigen lassen, als da auch noch hinterherzuhühnern.

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

    Also willst du mir eigentlich nur sagen, dass es so nicht funktioniert? :D na gut, aber das problem an dem dgv wird sein, dass im moment in der db nur dummy-daten stehen und dort irgendwann ca. 5000 mitarbeiter drin sind und ich glaube der user hat kein interesse daran sich durch 5000 leute zu scrollen...also sollte das mit der suche schon so bleiben wie es ist womit wir dann wieder bei der anfangsproblematik wären :X
    achja und die suche kann ja auch durchaus mehrere mitarbeiter finden, da es relativ wahrscheinlich ist, dass bei 5000 leuten einige dabei sind, die den selben namen tragen.
    und wie kann ich dann ohne den bindingnavigator zwischen denen hin und her wechseln und vorallem, wie kann ich ohne den navigator neue datensätze hinzufügen und/oder löschen?
    mittm Datagridview.
    guck dirdoch mal die Samples von DBExtensions an - die haben das alle drauf, weil IMO ohne CRUD ist ein DB-Demo nicht ernstzunehmen.

    Und sone Suche tätich nicht als Query an die DB richten, sondern einfach einen Filter an die BindingSource.Filter-Property zuweisen.

    Bei 5000 MA kann man was basteln, was während des Tippens filtert. Also du tippst den ersten Buchstaben, unds sind nurnoch ca. 250 MA, dann noch einen Buchstaben, und es sind nurnoch 50 - da kann man schon bequem durchscrollen.

    gugge DataExpressions - die Filter-Syntax unterstützt auch den Like - Operator (also sowas: BindingSource.Filter = "Name LIKE a*")
    sooo, ich bin wieder hier...

    Also das mit den Filtern klappt soweit super, allerdings funktioniert es auch hier nicht den Namen des Ersatzes. Lasse ich das TestSet ins DGV laden, zeigt er brav alle Namen an (habe es so gelöst, wie in deinem Sample "ErsatzApp").
    Setze ich allerdings einen Filter, zeigt er mir den Datensatz an, aber nicht mehr den Namen des Ersatzes. Ich befürchte, dass die Filter genau das gleiche machen, was ich mit meiner SQL Query getan habe.
    Weitere Ideen? Oder mache ich wieder was falsch? :P

    hoobeN schrieb:

    (habe es so gelöst, wie in deinem Sample "ErsatzApp")

    nanu? In ErsatzApp wird doch garkein Filter gesetzt.

    Und wenn man einen Filter setzen würde, würde dort selbstverständlich auch der Ersatz angezeigt. Die Filterung ändert ja nichts an den Daten, sondern zeigt nur weniger Datensätze an.

    Also kann ja nicht passieren, dass aussem DGV auf einmal die Spalte "Ersatz" verschwindet, nur weil ein Filter gesetzt wurde.

    hoobeN schrieb:

    (funzt irgendwie nicht mit Bild einfügen, kA)

    ähm - kannst du dir solche "Fehlerbeschreibungen" vlt. prinzipiell abgewöhnen?

    Sag immer genau, was du versucht hast, und was das unerwünschte Ergebnis ist. Und - falls es nicht klar sein sollte: auch, was das erwünschte Ergebnis gewesen wäre.
    Das ist glaub eine ganz allgemeine "Lebensweisheit" ;), und was Code betrifft, umso mehr.
    Ein Bild ist eine Bild-Datei, und ganz normal als Datei anzuhängen (der Reiter 2 neben dem Reiter mit den Smileys).

    Zum angezeigten Fehler: scheinbar filterst du die DataSource einer ComboboxColumn. Das geht natürlich schief, weil dadurch die Combos die eingejointen Werte der weggefilterten Daten nicht mehr anzeigen können.
    Also du hast ein DGV mit Standorten, und eine Spalte verweist auf Mitarbeiter, und da werden allerlei MAs angezeigt. Wenn nun ein Standort auf MA1 verweist, du MA1 aber aus der Combo-DataSource-BindingSource weggefiltert hast, dann kann die Combobox den ja nicht mehr anzeigen - wird also ungültig.

    hoobeN schrieb:

    Der Eintrag verschwindet, die Spalte bleibt.
    Bei mir nicht: ErsatzApp00.zip

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

    ErfinderDesRades schrieb:

    ähm - kannst du dir solche "Fehlerbeschreibungen" vlt. prinzipiell abgewöhnen?

    Okay ;)!

    Was das Problem angeht .... es lag anscheinend an den ' .. dass ich da nicht selbst drauf gekommen bin -.-'
    Naja, ich denke den Rest schaffe ich jetzt alleine und falls sich doch noch weitere Probleme ergeben - melde ich mich ^^ .
    Danke vielmals! :thumbsup: :thumbsup:
    Gut, eine Sache funktioniert nicht vernünftig.
    Ich komme mit der Methode Save() nicht zurecht. Also im Grunde genommen tut sie gar nichts. Man stelle sich folgendes Szenario vor:
    Es gibt einen Button (Hinzufügen), welcher eine neue Form lädt. Diese Form beinhaltet ein großes DGV, wo quasi die nackte DB zu sehen ist. Und jetzt möchte ich dort gerne einen neuen Datensatz hinzufügen und ihn danach abspeichern können.
    Allerdings passiert einfach nichts und es wird auch nichts in die DB geschrieben. Das ist doch aber möglich, wenn ich die DBExtensions richtig verstanden habe.
    Kannst du mir dabei vielleicht noch behilflich sein? Danke :)
    Also eigentlich ist es ein und das selbe DataSet und nicht zwei. Aber ich glaube schon, dass ich es registriert habe:

    VB.NET-Quellcode

    1. Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. 'TODO: Diese Codezeile lädt Daten in die Tabelle "MyTestSet.Standorte". Sie können sie bei Bedarf verschieben oder entfernen.
    3. Me.StandorteTableAdapter.Fill(Me.MyTestSet.Standorte)
    4. 'TODO: Diese Codezeile lädt Daten in die Tabelle "MyTestSet.Mitarbeiter". Sie können sie bei Bedarf verschieben oder entfernen.
    5. Me.MitarbeiterTableAdapter.Fill(Me.MyTestSet.Mitarbeiter)
    6. Dim adp = New DatasetAdapter( _
    7. OleDbFactory.Instance, My.Settings.Geraetedatenbank_test_SQL___CopyConnectionString, _
    8. ConflictOption.OverwriteChanges)
    9. Me.AlignOnTop.MyTestSet.Adapter(adp).Register(Me)
    10. End Sub
    11. Private Sub Speichern(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Speichern.Click
    12. MyTestSet.Save(Me)
    13. End Sub


    Und dann passiert folgendes:

    hmm. Sieht eiglich richtig aus.
    Nur die typisierten TableAdapter braucht man nicht, wenn man DBExtensions benutzt.
    Das spart einige tausend Zeilen generierten Code, und macht auch den Dataset-Designer übersichtlicher.

    Das was da passiert verstehe ich nicht. Sieht aus wie Jil-Code - kriegst du keine vernünftige Fehlermeldung?

    Ah! vmtl. werden die Tabellen durch die typisierten Adapter in falscher Reihenfolge befüllt, und im Form_Load besteht ein bekannter Bug, dass die IDE Exceptions nicht gescheit verarbeitet.

    Also probierma die typisierten TAs runterschmeißen, und laden mit der DBExtension Dataset.Fill()
    "Hier stand Müll"...

    VB.NET-Quellcode

    1. With MyTestSet
    2. .Fill(.Standorte, .Mitarbeiter)
    3. .Register(Me)
    4. End With


    Hab es jetzt so versucht, aber da bekomme ich auch ne Fehlermeldung:

    "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."

    Könnte das Problem evtl. auch daran liegen, dass das DataSet zwei Spalten besitzt, welches die DB nicht kennt? Also die beiden
    Felder, die ich mit parent(Relation).Spalte befülle?

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

    möglich. DBExtensions geht davon aus, dass alle Dataset-Spalten auch in der DB existieren (ausser berechnete Spalten).
    Aber ich hätte dann einen anderen Fehler erwartet.

    Aber warum machste auch sowas?
    Die Information, wer der Parent ist, muß doch mit-gespeichert werden, oder nicht?

    Ansonsten gugge auch Exceptions, und was sie uns sagen wollen, Themen NullRefException und tücke beim StartUp.