none
Daten aus 2 oder mehr Datatables auslesen RRS feed

  • Frage

  • Hallo,

    Ich versuche aus einem Dataset mit mehreren verknüpften Tabellen Daten zu holen und komme leider nicht weiter. Um es etwas deutlicher zu machen, hier ein abgespecktes Beispiel:

    clear-host
    
    $DataSet = New-Object System.Data.DataSet
    $Table_1 = $DataSet.Tables.Add("Table_1")
    $Table_2 = $DataSet.Tables.Add("Table_2")
    
    $Properties_1 = @("Name","Gehalt","Land")
    $Properties_1 | foreach {
        $Column = New-Object System.Data.DataColumn($_)
        $Table_1.Columns.Add($Column)
      }
     
    $Properties_2 = @("Name","Automarke","Kraftstoff")
    $Properties_2 | foreach {
        $Column = New-Object System.Data.DataColumn($_)
        $Table_2.Columns.Add($Column)
      }
      
    #Tabellen befüllen 
    $Null=$Table_1.Rows.Add("Huber","45000","USA")
    $Null=$Table_1.Rows.Add("Mayer","66000","Germany")
    $Null=$Table_1.Rows.Add("Napf","53000","France")
    " "
    $Null=$Table_2.Rows.Add("Huber","Mercedes","Diesel")
    $Null=$Table_2.Rows.Add("Mayer","Honda","Normal")
    $Null=$Table_2.Rows.Add("Napf","BMW","Super")
    
    #Verknüpfung anlegen
    $Table_1.PrimaryKey = $Table_1.Columns["Name"] 
    $Table_2.PrimaryKey = $Table_2.Columns["Name"] 
    $Column1= $DataSet.Tables["Table_1"].Columns["Name"] 
    $Column2 =$DataSet.Tables["Table_2"].Columns["Name"]
    $Relation1 = New-Object System.Data.DataRelation( "beideTables", $Column1, $Column2 )
     
    

    Ich habe hier ein Dataset ($DataSet) mit zwei über die Spalte "Name" verknüpften Tabellen ($Table_1, $Table_2) erstellt.

    Ich suche nun einen Weg/ Abfrage, um Werte aus beiden Tabellen zu erhalten. z.b. Name, Gehalt aus Table_1 und Auto aus Table_2. Vielleicht bin auch mit DataSets/ DataTables und DataRelation auf dem Holzweg und es gibt geschicktere Ansätze

    Im richtigen Skript handelt es sich um aus mehreren xml-Dateien eingelesene Userdaten mit jeweils verschiedenen Informationen

    vielen Dank

    Kai


    • Bearbeitet Kai Yorck Dienstag, 22. Januar 2013 23:44
    Dienstag, 22. Januar 2013 23:43

Antworten

  • Hallo Kai ! Willkommen hier im TechNet Forum ! Hast du dich verlaufen? ;-)
    clear-host
    
    $DataSet = New-Object System.Data.DataSet
    $Table_1 = $DataSet.Tables.Add("Table_1")
    $Table_2 = $DataSet.Tables.Add("Table_2")
    
    $Properties_1 = @("Name","Gehalt","Land")
    $Properties_1 | foreach {
        $Column = New-Object System.Data.DataColumn($_)
        $Table_1.Columns.Add($Column)
      }
     
    $Properties_2 = @("Name","Automarke","Kraftstoff")
    $Properties_2 | foreach {
        $Column = New-Object System.Data.DataColumn($_)
        $Table_2.Columns.Add($Column)
      }
      
    #Tabellen befüllen 
    $Null=$Table_1.Rows.Add("Huber","45000","USA")
    $Null=$Table_1.Rows.Add("Mayer","66000","Germany")
    $Null=$Table_1.Rows.Add("Napf","53000","France")
    " "
    $Null=$Table_2.Rows.Add("Huber","Mercedes","Diesel")
    $Null=$Table_2.Rows.Add("Mayer","Honda","Normal")
    $Null=$Table_2.Rows.Add("Napf","BMW","Super")
    $Null=$Table_2.Rows.Add("Huber","Honda","Normal")
    $Null=$Table_2.Rows.Add("Huber","BMW","Super")
    $Null=$Table_2.Rows.Add("Napf","Mercedes","Diesel")
    
    #Verknüpfung anlegen
    $Table_1.PrimaryKey = $Table_1.Columns["Name"] 
    $Table_2.PrimaryKey = $Table_2.Columns["Name"] 
    $Column1= $DataSet.Tables["Table_1"].Columns["Name"] 
    $Column2 =$DataSet.Tables["Table_2"].Columns["Name"]
    $Relation1 = New-Object System.Data.DataRelation( "beideTables", $Column1, $Column2 )
    
    # Die Relation muss zu dem Dataset hinzugefügt werden!
    $DataSet.Relations.Add($Relation1)
    
    # Man kann das nun über die Relation.ParentTable abfragen
    # Da ein Huber oder Napf mehrere Autos besitzt enstehgt hier eine 1:N Beziehung!
    # Diese kann man nur mit verschachtelten schleifen darstellen was teilweise redundate Daten ergibt!
    ForEach($ParentRow in $Relation1.ParentTable.Rows) {
        ForEach($ChildRow in $ParentRow.GetChildRows($Relation1)) {
           new-Object -TypeName PSObject -Property @{Name=$ParentRow["Name"];Gehalt=$ParentRow["Gehalt"];Land=$ParentRow["Land"];Automarke=$ChildRow["Automarke"];Kraftstoff=$ChildRow["Kraftstoff"]}
        }
    }

    Siehe: In Beziehung stehende Daten suchen
    http://openbook.galileocomputing.de/visual_csharp_2010/visual_csharp_2010_26_004.htm

    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!



    • Bearbeitet Peter Kriegel Mittwoch, 23. Januar 2013 07:13
    • Als Antwort markiert Kai Yorck Mittwoch, 23. Januar 2013 22:35
    Mittwoch, 23. Januar 2013 07:11

Alle Antworten

  • Hallo Kai ! Willkommen hier im TechNet Forum ! Hast du dich verlaufen? ;-)
    clear-host
    
    $DataSet = New-Object System.Data.DataSet
    $Table_1 = $DataSet.Tables.Add("Table_1")
    $Table_2 = $DataSet.Tables.Add("Table_2")
    
    $Properties_1 = @("Name","Gehalt","Land")
    $Properties_1 | foreach {
        $Column = New-Object System.Data.DataColumn($_)
        $Table_1.Columns.Add($Column)
      }
     
    $Properties_2 = @("Name","Automarke","Kraftstoff")
    $Properties_2 | foreach {
        $Column = New-Object System.Data.DataColumn($_)
        $Table_2.Columns.Add($Column)
      }
      
    #Tabellen befüllen 
    $Null=$Table_1.Rows.Add("Huber","45000","USA")
    $Null=$Table_1.Rows.Add("Mayer","66000","Germany")
    $Null=$Table_1.Rows.Add("Napf","53000","France")
    " "
    $Null=$Table_2.Rows.Add("Huber","Mercedes","Diesel")
    $Null=$Table_2.Rows.Add("Mayer","Honda","Normal")
    $Null=$Table_2.Rows.Add("Napf","BMW","Super")
    $Null=$Table_2.Rows.Add("Huber","Honda","Normal")
    $Null=$Table_2.Rows.Add("Huber","BMW","Super")
    $Null=$Table_2.Rows.Add("Napf","Mercedes","Diesel")
    
    #Verknüpfung anlegen
    $Table_1.PrimaryKey = $Table_1.Columns["Name"] 
    $Table_2.PrimaryKey = $Table_2.Columns["Name"] 
    $Column1= $DataSet.Tables["Table_1"].Columns["Name"] 
    $Column2 =$DataSet.Tables["Table_2"].Columns["Name"]
    $Relation1 = New-Object System.Data.DataRelation( "beideTables", $Column1, $Column2 )
    
    # Die Relation muss zu dem Dataset hinzugefügt werden!
    $DataSet.Relations.Add($Relation1)
    
    # Man kann das nun über die Relation.ParentTable abfragen
    # Da ein Huber oder Napf mehrere Autos besitzt enstehgt hier eine 1:N Beziehung!
    # Diese kann man nur mit verschachtelten schleifen darstellen was teilweise redundate Daten ergibt!
    ForEach($ParentRow in $Relation1.ParentTable.Rows) {
        ForEach($ChildRow in $ParentRow.GetChildRows($Relation1)) {
           new-Object -TypeName PSObject -Property @{Name=$ParentRow["Name"];Gehalt=$ParentRow["Gehalt"];Land=$ParentRow["Land"];Automarke=$ChildRow["Automarke"];Kraftstoff=$ChildRow["Kraftstoff"]}
        }
    }

    Siehe: In Beziehung stehende Daten suchen
    http://openbook.galileocomputing.de/visual_csharp_2010/visual_csharp_2010_26_004.htm

    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!



    • Bearbeitet Peter Kriegel Mittwoch, 23. Januar 2013 07:13
    • Als Antwort markiert Kai Yorck Mittwoch, 23. Januar 2013 22:35
    Mittwoch, 23. Januar 2013 07:11
  • Hallo Peter,

    Danke dir für deine Lösung und den Link!

    Ich habe jetzt noch eine andere Lösung bekommen, die sogar ohne die Relation auskommt:

    $baseTable = $Table_1.Copy()
    $baseTable.Merge($Table_2)
    $baseTable | ft -AutoSize

    Kai

    Mittwoch, 23. Januar 2013 22:35
  • Eine Relation ist in erster Linie dazu da einen Constraint (Zwangsbedingung / Regel) zu erstellen. Nicht um Kreuzknobelabfragen zu ermöglichen!
    Die Relation achtet darauf dass die verknüpften (Schlüssel) Spalten nur Schlüssel enthalten die zueinander passen.

    Schau dir mal beide Lösungen an und überlege ob es das ist was du möchtest ;-)

    Relation ist "Intelligent" und wirft Fehler, weil die Schlüssel nicht zueinander passen.

    clear-host
    
    $DataSet = New-Object System.Data.DataSet
    $Table_1 = $DataSet.Tables.Add("Table_1")
    $Table_2 = $DataSet.Tables.Add("Table_2")
    
    $Properties_1 = @("Name","Gehalt","Land")
    $Properties_1 | foreach {
        $Column = New-Object System.Data.DataColumn($_)
        $Table_1.Columns.Add($Column)
      }
     
    $Properties_2 = @("Name","Automarke","Kraftstoff")
    $Properties_2 | foreach {
        $Column = New-Object System.Data.DataColumn($_)
        $Table_2.Columns.Add($Column)
      }
      
    #Tabellen befüllen 
    $Null=$Table_1.Rows.Add("Huber","45000","USA")
    $Null=$Table_1.Rows.Add("Mayer","66000","Germany")
    $Null=$Table_1.Rows.Add("Napf","53000","France")
    " "
    $Null=$Table_2.Rows.Add("Huber","Mercedes","Diesel")
    $Null=$Table_2.Rows.Add("Mayer","Honda","Normal")
    $Null=$Table_2.Rows.Add("Napf","BMW","Super")
    $Null=$Table_2.Rows.Add("Huber","Honda","Normal")
    $Null=$Table_2.Rows.Add("Huber","BMW","Super")
    $Null=$Table_2.Rows.Add("Napf","Mercedes","Diesel")
    
    $Null=$Table_2.Rows.Add("Müller","Mercedes","Diesel")
    $Null=$Table_2.Rows.Add("Brösel","Honda","Normal")
    
    #Verknüpfung anlegen
    $Table_1.PrimaryKey = $Table_1.Columns["Name"] 
    $Table_2.PrimaryKey = $Table_2.Columns["Name"] 
    $Column1= $DataSet.Tables["Table_1"].Columns["Name"] 
    $Column2 =$DataSet.Tables["Table_2"].Columns["Name"]
    $Relation1 = New-Object System.Data.DataRelation( "beideTables", $Column1, $Column2 )
    
    # Die Relation muss zu dem Dataset hinzugefügt werden!
    $DataSet.Relations.Add($Relation1)
    
    # Man kann das nun über die Relation.ParentTable abfragen
    # Da ein Huber oder Napf mehrere Autos besitzt enstehgt hier eine 1:N Beziehung!
    # Diese kann man nur mit verschachtelten schleifen darstellen was teilweise redundate Daten ergibt!
    ForEach($ParentRow in $Relation1.ParentTable.Rows) {
        ForEach($ChildRow in $ParentRow.GetChildRows($Relation1)) {
           new-Object -TypeName PSObject -Property @{Name=$ParentRow["Name"];Gehalt=$ParentRow["Gehalt"];Land=$ParentRow["Land"];Automarke=$ChildRow["Automarke"];Kraftstoff=$ChildRow["Kraftstoff"]}
        }
    }

    Das Merge (oder Join) ist dumm und produziert schlechte Daten die nicht intelligent zusammengefügt werden!!!!!!!!!!!!!

    Deshalb habe ich es dir nicht als alternative vorgeschlagen!

    clear-host
    
    $DataSet = New-Object System.Data.DataSet
    $Table_1 = $DataSet.Tables.Add("Table_1")
    $Table_2 = $DataSet.Tables.Add("Table_2")
    
    $Properties_1 = @("Name","Gehalt","Land")
    $Properties_1 | foreach {
        $Column = New-Object System.Data.DataColumn($_)
        $Table_1.Columns.Add($Column)
      }
     
    $Properties_2 = @("Name","Automarke","Kraftstoff")
    $Properties_2 | foreach {
        $Column = New-Object System.Data.DataColumn($_)
        $Table_2.Columns.Add($Column)
      }
      
    #Tabellen befüllen 
    $Null=$Table_1.Rows.Add("Huber","45000","USA")
    $Null=$Table_1.Rows.Add("Mayer","66000","Germany")
    $Null=$Table_1.Rows.Add("Napf","53000","France")
    " "
    $Null=$Table_2.Rows.Add("Huber","Mercedes","Diesel")
    $Null=$Table_2.Rows.Add("Mayer","Honda","Normal")
    $Null=$Table_2.Rows.Add("Napf","BMW","Super")
    $Null=$Table_2.Rows.Add("Huber","Honda","Normal")
    $Null=$Table_2.Rows.Add("Huber","BMW","Super")
    $Null=$Table_2.Rows.Add("Napf","Mercedes","Diesel")
    
    $Null=$Table_2.Rows.Add("Müller","Mercedes","Diesel")
    $Null=$Table_2.Rows.Add("Brösel","Honda","Normal")
    
    $baseTable = $Table_1.Copy()
    $baseTable.Merge($Table_2)
    $baseTable | ft -AutoSize


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!


    Donnerstag, 24. Januar 2013 06:14