Typisiertes DataSet + Inner Join

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Typisiertes DataSet + Inner Join

    yo Leute,

    mittlerweile sind das typisierte DataSet und ich ganz gute Freunde geworden. Es lauft alles so wie ich es mir vorgestellt habe mit wenig Aufwand.
    Nun bin ich aber, denk ich an die Grenzen des DataSets gestoßen was mir etwas ungut aufstoßt...

    Ich habe nun im Netz schon einiges versucht heraus zu finden, jedoch find ich keine Lösung zu folgendem Problem:
    Wie erstellt man eine Abfrage mit einem ganz einfachen Join?

    Zusätzliche Abfragen erstelle ich im DataSet Designer bei den TableAdapter per Abfrage hinzufügen.
    Erstelle ich nun eine so eine Abfrage und will Auch im Select Spalten der gejointen Tabelle anzeigen, kommt beim Speichern die Meldung:
    "Der neue Befehlstext gibt Daten mit einem anderen Schema als dem Schema der Hauptabfrage zurück. Um dies zu vermeiden, überprüfen Sie die Syntax des Befehlszeilentexts."

    Kennt wer eine Lösung dazu?
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Hab mal was angehängt (Beispiel-Datenbank halt)

    ich denke es ist (leider) erklärbar warum es nicht geht. Da die Abfrage ja ein BedienerDataTable benötigt und dieses ja die Eigenschaften der Firma nicht besitzt, funzt es auch nicht.
    Aber es ist durchaus üblich, dass mal zB in einem Grid Daten von mehreren Tabellen auf einmal anzeigen muss.

    lg
    Bilder
    • ds_start.PNG

      8,44 kB, 390×163, 173 mal angesehen
    • ds_neue_Abfrage.PNG

      54,18 kB, 703×571, 193 mal angesehen
    • dsMeldung.PNG

      20,48 kB, 484×183, 184 mal angesehen
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    gugge JoiningView auf vier Views-Videos

    Sql-InnerJoin ist unbrauchbar, denn solch Queries kannst du prinzipiell nicht editiert zurückspeichern.

    beim typDataset ruft man die Daten nach Tabellen getrennt ab, und hält sie auch getrennt im typDataset. Der Joining-Vorgang findet erst im DGV statt, und bietet dort die verblüffende Option, dass man nun auch Zuordnungen editieren kann, indem man einen anneren Fremdschlüssel wählt.

    gugge dort auch m:n-View
    Hab mir das JoiningView Video nun angeguggt.
    Es sieht ja ansich genau nach dem aus was ich benötige. Jedoch hab ich eine Frage wegen der Performance:

    Es werden ja die Daten je Tabelle mit dem .Fill des TableAdapters eingelesen oder? Hierbei wird ja noch kein Filter gesetzt. D.h. es werden ALLE Daten der Tabelle eingelesen.
    In dem Beispiel ist es simpel gehalten mit Artikel, Kategorie und Lieferant. Was wenn das aber nun etwas komplexer wird und auch in allen benötigten Tabellen die Daten mal anwachsen? Hier wird zuerst alles eingelesen und dann dementsprechend angezeigt?

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

    fichz schrieb:

    Es werden ja die Daten je Tabelle mit dem .Fill des TableAdapters eingelesen oder?
    Nein, die Beispiele sind noch simpler, die sind ja DatasetOnly.
    Ich sag ja immer, man soll das trennen: DB-Zugriffe lernen von Dataset lernen, denn Dataset lernt man besser ohne dass gleich auch noch die DB-Zugriffe 100% tipTop sein müssen.

    Ansonsten hast du recht: Bei mit DB-Zugriffe werden die im View gejointen Tabellen mit .Fill eingelesen, standardmäßig mit TableAdapter.Fill.
    Ich selbst halte ziemlich wenig von den generierten TableAdaptern - das ist pro Tabelle > 200 Zeilen generierter Code, eiglich ganz unnötig, denn man kann viel besser dynamisch DataAdapter (beachte den Unterschied!) konfigurieren - das sind vlt. 300 Zeilen, aber die gelten dann für alle Tabellen in allen Datenbanken auf allen DB-Systemen.

    Bei den TableAdaptern kann man im DatasetDesigner auch Filter und was konfigurieren - aber dassis immer sowas von aufgeblasen! Und man kann glaub sogar das TableAdapter-Sql so einstellen, dass die geladenen Tabellen nicht mehr zum Dataset kompatibel sind - also da guckstedann aus Wäsche.

    Stattdessen habich DBExtensions programmiert, ein Framework, wo die Fill-Funktionen als Extension-Methods implementiert sind.
    Diese Fill-Methoden haben Überladungen, wo man eine halbe Sql-Query angeben kann - nämlich vorzugsweise den WHERE-Abschnitt - das wäre dann dein Filter.
    Aber es gibt da auch intelligentere .Fill-Überladungen, die man beauftragen kann, die notwendigen Sql-Inner Join - Formulierungen selbst zu generieren.
    Weil wenn du einen Datensatz hast, und der ist mit 2 anneren Tabellen verknüpft, dann ist ja vom Prinzip her alles klar, was geladen werden muß, da brauch sich nicht ein Programmierer das Hirn zermatern, um das Sql dafür auszubaldowern.
    Gugge dort mal das NorthWind-Project, da im HauptForm werden initial alle Kunden geladen, und von den Bestellungen und BestellDetails wird immer nachgeladen, wenn grad ein bestimmter Kunde selektiert wurde. (Beachte die Sql-Logs im Ausgabefenster).

    Noch ein Gedanke zu Performance: Wird im View gejoint, so müssen die notwendigen Tabellen getrennt geladen werden, das sind mehrere Sql-Commands. Dafür aber haben die übertragenen Tabellen weniger Spalten, und das reduziert den Traffic u.U. wieder.
    guck, wenn du 20 Bestellungen lädtst, mit je 30 BestellDetails.
    Mit Sql-InnerJoin sind das 600 Datensätze, und jeder hat alle Spalten der BestellDetails und alle Spalten der Bestellungen.

    Lädtst du getrennt, so hast du 20 Bestellung-Datensätze mit nur den Bestellung-Spalten. Und dazu (LöwenAnteil) 600 BestellDetail-Datensätze - aber die haben jetzt auch nur die Spalten der BestellDetails!

    Nur als Überlegung - getestet habichdas noch nie, ab wieviele Spalten und wie was da performancemäßig die Nase vorn hat. (Viel wichtiger ist ja, dass die zusammengerührte Sql-Tabelle nicht rückspeicherbar ist).