2010-05-19 2 views
1

J'ai plusieurs jeux de données que je voudrais combiner en un seul. Il existe un champ ID commun pouvant être associé à chaque ligne. Appeler Fusionner sur l'ensemble de données ajoutera des lignes supplémentaires à l'ensemble de données, mais je souhaite combiner les colonnes supplémentaires. Il y a trop de champs pour le faire dans une requête et donc le rendrait ingérable. Chaque requête individuelle serait capable de gérer les commandes pour s'assurer que les données sont placées dans la bonne rangée.Combiner plusieurs colonnes de jeu de données à un jeu de données

Par exemple permet de dire que j'ai deux requêtes résultant en deux ensembles de données:

SELECT ID, colA, colB 
SELECT colC, colD 

L'ensemble de données résultant serait ressembler à

ID colA colB colC colD 
1 a b c d 
2 e f g h 

Toutes les idées sur les moyens d'y parvenir?

+0

Cela pourrait aider: http://stackoverflow.com/questions/1259788/join-between-two-tables-with-linq-to-datasets –

Répondre

1

Voici un exemple de la façon d'accomplir ce que vous voulez en utilisant ASP.NET et VB.NET. J'ai créé un sous-marin "MergeColumns" et "MergeData" pour vous.

Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     'Create the dataset and put in the data. Normally you will just get this from a database query' 

     Dim ds1 As New Data.DataSet 
     Dim ds2 As New Data.DataSet 

     Dim dt1 = ds1.Tables.Add() 
     dt1.Columns.Add("ID", GetType(Int32)) 
     dt1.Columns.Add("ColA", GetType(String)) 
     dt1.Columns.Add("ColB", GetType(String)) 

     Dim dt2 = ds2.Tables.Add() 
     dt2.Columns.Add("ColC", GetType(String)) 
     dt2.Columns.Add("ColD", GetType(String)) 

     dt1.Rows.Add(1, "a", "b") 
     dt2.Rows.Add("c", "d") 
     dt1.Rows.Add(2, "e", "f") 
     dt2.Rows.Add("g", "h") 

     'Sample data created, now to merge the results like you want' 
     Dim dsNew As New Data.DataSet 
     Dim dtNew = dsNew.Tables.Add(0) 

     MergeColumns(dtNew, dt1, dt2) 
     MergeData(dtNew, dt1, dt2) 

     'Display the results' 
     dsNew.AcceptChanges() 
     Response.Write(dsNew.GetXml) 

    End Sub 


    Private Sub MergeColumns(ByVal TargetTable As Data.DataTable, ByVal ParamArray SourceTables() As Data.DataTable) 
     For Each dtSource In SourceTables 
      'Make a clone of the table, then steal the columns from the clone' 
      Dim dtClone = dtSource.Clone 

      While dtClone.Columns.Count > 0 
       Dim dc = dtClone.Columns(0) 

       dtClone.Columns.Remove(dc) 

       TargetTable.Columns.Add(dc) 
      End While 
     Next 
    End Sub 


    Private Sub MergeData(ByVal TargetTable As Data.DataTable, ByVal ParamArray SourceTables() As Data.DataTable) 
     'Determine the number of rows the final table will have' 
     Dim nMaxRowCount = 0 
     For Each dt In SourceTables 
      If dt.Rows.Count > nMaxRowCount Then 
       nMaxRowCount = dt.Rows.Count 
      End If 
     Next 

     For i = 0 To nMaxRowCount - 1 
      'Create a new row using column data from each table. Assumes the name is unique across tables.' 
      Dim drTarget = TargetTable.NewRow 
      For Each dcTarget As Data.DataColumn In TargetTable.Columns 
       For Each dt In SourceTables 
        If i < dt.Rows.Count AndAlso dt.Columns.Contains(dcTarget.ColumnName) Then 
         drTarget(dcTarget) = dt.Rows(i)(dcTarget.ColumnName) 
        End If 
       Next 
      Next 
      TargetTable.Rows.Add(drTarget) 
     Next 

    End Sub 
Questions connexes