Benutzer mit den meisten Antworten
Daten aus 2 oder mehr Datatables auslesen

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
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
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
-
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!- Bearbeitet Peter Kriegel Donnerstag, 24. Januar 2013 06:20