Datatables DataView und Select-Anweisungen

  • VB.NET
  • .NET 4.5

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Datatables DataView und Select-Anweisungen

    Hallo,

    auf dieser Webseite von Microsoft wird beschrieben, wie eine Select-Methode auf einem Datatable-Objekt ausgeführt werden kann:

    support.microsoft.com/en-us/he…lass-in-visual-basic--net

    Gibt es noch eine einfachere Methode, als z.B. die CreateJoinTable-Methode, wenn es darum geht, aus mehr als einer Tabelle Daten auslesen zu können?

    Bspw.:

    VB.NET-Quellcode

    1. dt = dsHelper.CreateJoinTable("TestTable", ds.Tables!Employees, "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department")


    Mit diesem Befehl werden aus zwei Tabellen alle Einträge ausgelesen, die mit einer Relationalen Verbindung verknüpft sind.

    Falls nun allerdings mehr als eine Relationale Verbindung vorhanden ist, schaut es schon wieder um ganz anders aus. Auf diese Fälle gehen die Beispiele nicht ein.

    Besser wäre da, wenn man nac einem SQL-Standard-Verfahren z.B. die Select direkt an einen Interpreter übergeben könnte, wie z.B. diesen:

    SQL-Abfrage

    1. Select Details.Name, Employees.* from

    SQL-Abfrage

    1. Tables!Employees inner join Details on Drzails.ID_Employees = Details.ID right join WeitereDetails on WeitereDetails.ID = Employees.ID_WeitereDetails whrere ....


    Nachteil dieses Verfahrens ist naürlich, dass es nicht mehr objektorientiert ist, und spätestens beim Umbenennen einer Dataset-Tabelle fehlschlagen wird.

    Welches Verfahren nutzt ihr denn?
    Daten joine ich nie.
    Stattdessen bilde ich "joinedViews" mit geeigneten Steuerelementen.
    Joinen von Daten ist ein "plattklopfen" der Hierarchie. Dabei geht Information verloren, die Option des Rückspeicherns ist im Eimer, und jede Menge Redundanz.
    Hingegen ein JoinedView lässt die Tabellen wie sie sind - ist im Wortsinne ein "View", also nur eine Art, die Daten zu sehen, von mehreren möglichen Arten.
    Die anderen Arten können übrigens auch paralell dazu implementiert sein.
    gugge vier Views-Videos - die entsprechenden Filmle.

    Ansonsten halte ich dein MSDN-Beispiel für ziemliche Grütze. Du kannst daraus vor allem lernen, dass alles auf MSDN zwar funktioniert, aber deshalb nicht guter Code sein muss.
    Ok- das ist keine Begründung. Meine Begründung ist, dass MSDN da mit untypisierten Datasets arbeitet, und damit alle Möglichkeiten von Databinding und typisierter Programmierung in' Sack haut - ich verweise nochmal auf meine Videos, die versuchen zu zeigen, was damit (typisierte Programmierung, Databinding) gemeint ist.

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

    Hallo,

    in den View-Demos wird immer ein UserForm verwendet, um Daten abfragen zu können.

    Im Beispiel ...

    DBExtensions - allgemeine Lösung der Daten-Persistierung via Datenbanken

    ... wird srcKundeBestellung einem Filter übergeben. Ich konnte nicht herausfinden, um welchen Typ es sich beim Objekt srcKundeBestellung handelt.

    In meinem Beispiel wird auf das Projekt HelpersSmallEd zurückgegriffen:

    VB.NET-Quellcode

    1. Dim myHosts As New AdminData.DataServices
    2. Dim myDTS As AdminData.myHostsDTS = myHosts.fillDTSData
    3. 'Dim dsHelper As AdminData.DataSetHelper
    4. Dim myHost = myDTS.tab_hosts
    5. Dim myssh = myDTS.tab_Ssh


    In der Klasse AdminData sind weitere Datenbank-Funktionen vorhanden, über die das Dataset an mehrere Projekte verteilt wird. Das Dataset braucht somit nur in einem Projekt erstellt werden.

    In der Tabelle tab_hosts ist ein Feld ID_SSH vorhanden, welches mit dem Feld ID in der Tabelle Tab_ssh verbunden ist.

    Wie kann man nun eine Abfrage ausführen, um die Datensätze zu erhalten, in denen ID_SSH von der Tabelle Tab_hosts auf einen existierenden Datensatz in der Tabelle Tab_ssh verweist?

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

    Hallo,

    ein Screenshot vom eingesetzten Dataset kann hier heruntergeladen werden:

    dropbox.com/s/a391021tnsdhq7p/Dataset-Designer.png?dl=0

    Nachtrag:

    Mit diesem VB-Code können die Daten auch typisiert ausgelesen werden:

    VB.NET-Quellcode

    1. Dim myHosts As New AdminData.DataServices
    2. Dim myDTS As AdminData.myHostsDTS = myHosts.fillDTSData
    3. 'Dim dsHelper As AdminData.DataSetHelper
    4. Dim myHost = myDTS.tab_hosts
    5. Dim myssh = myDTS.tab_Ssh
    6. Dim myRows = From tabHost In myHost
    7. Join tabSSH In myssh On tabHost.ID_SSH Equals tabSSH.ID
    8. Select tabHost, tabSSH Where tabHost.AutoBoot = False
    9. For Each rw In myRows
    10. Console.WriteLine("Host: {0} hat das SSH-Profil: {1}", rw.tabHost.Hostname, rw.tabSSH.Name)
    11. Next




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

    Wenn das der Grund für den Join-Wunsch ist, dann der dezente Hinweis, dass dies auch ohne Join, sondern mit den ganz normalen tDS-Funktionalitäten geht.

    VB.NET-Quellcode

    1. For Each Host In myDTS.tab_hosts
    2. Console.WriteLine($"Host: {Host.HostName} hat das SSH-Profil {Host.tab_sshRow.Name}")
    3. Next

    Da jede Zeile einer untergeordneten Tabelle (ich nenn's jetzt mal SubRow) einen direkten Verweis auf die übergeordnete Tabellenzeile (SupRow) hat, kann von der SubRow problemlos auf die SupRow zugegriffen werden.
    Da jede SupRow potentiell mehrere SubRows hat, geht das auch den Weg andersrum (über z.B. MyDTS.tab_ssh(0).Gettab_hostsRows), man erhält aber ein Array, nämlic alle SubRows, die mit der SupRow verknüpft sind. Logisch. Also: Kein Join, einfach Direktverbindung nutzen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

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