3

私は Microsoft Access データベースを使用しています (この特定の状況ではその選択肢がないため、他のデータベースを使用するように勧めないでください)。Access データベース テーブルは 255 を超える列を持つことができないため、情報を 5 つの異なるテーブルに分割する垂直データベース パーティション手法を使用しています。各テーブルには 100 列あり、最初の列が主キーです。(ここでデータベースの正規化を提案しないでください)。次に、Excel ファイルにエクスポートできるように、これら 5 つのテーブルからデータを読み取る必要があります。

これを達成するために、次の手順を実行しましたが、複数のテーブルを組み合わせる方法がわかりませんでした。

  1. これらの各テーブルを読み取り、別の DataTable を同じ DataSet に入れています。(Accessデータベースを使用しているため、すべてのテーブルからすべての列を選択することはできません)

  2. これらの 5 つのテーブルで Relationship を宣言しました

  3. 次に、これらの DataTable を 1 つの DataTable に結合する必要があります。これは、合計 496 列になることを意味します。同じ情報なので、4つのテーブルから主キーを削除しています。どうすればいいですか?

    Dim conn As OleDbConnection = New OleDbConnection
    Conn ="Connection string stuff goes"
    
    Dim FinalDS As New DataSet
    Dim DataSet1 As New DataSet
    Dim DataSet2 As New DataSet
    
    SQLstr1 = "SELECT * FROM Table1"
    SQLstr2 = "SELECT * FROM Table2"
    SQLstr3 = "SELECT * FROM Table3"
    SQLstr4 = "SELECT * FROM Table4"
    SQLstr5 = "SELECT * FROM Table5"
    
    Dim DA1 As New OleDb.OleDbDataAdapter(SQLstr1, cn)
    Dim DA2 As New OleDb.OleDbDataAdapter(SQLstr2, cn)
    Dim DA3 As New OleDb.OleDbDataAdapter(SQLstr3, cn)
    Dim DA4 As New OleDb.OleDbDataAdapter(SQLstr4, cn)
    Dim DA5 As New OleDb.OleDbDataAdapter(SQLstr5, cn)
    
    Try
       DA1.Fill(FinalDS, "Tl")
       DA2.Fill(FinalDS, "T2")
       DA3.Fill(FinalDS, "T3")
       DA4.Fill(FinalDS, "T4")
       DA5.Fill(FinalDS, "T5")
    
       Dim DataRelation1 As New DataRelation("R1", _
                        FinalDS.Tables("T1").Columns("ID"), _
                        FinalDS.Tables("T2").Columns("ID"))
    
    
       Dim DataRelation2 As New DataRelation("R2", _
                        FinalDS.Tables("T2").Columns("ID"), _
                        FinalDS.Tables("T3").Columns("ID"))
    
       Dim DataRelation3 As New DataRelation("R3", _
                        FinalDS.Tables("T3").Columns("ID"), _
                        FinalDS.Tables("T4").Columns("ID"))
    
       Dim DataRelation4 As New DataRelation("R4", _
                        FinalDS.Tables("T4").Columns("ID"), _
                        FinalDS.Tables("T5").Columns("ID"))
    
    
       FinalDS.Relations.Add(DataRelation1)
       FinalDS.Relations.Add(DataRelation2)
       FinalDS.Relations.Add(DataRelation3)
       FinalDS.Relations.Add(DataRelation4)
       FinalDS.Relations.Add(DataRelation5)
    
    
      'Here I need to combine all these five DataTables into one DataTable
      'So that I can use Export it to excel from that one Final DataTable instead of  reading data from five different DataTables.
    
       'My Exporting to excel logies goes here which simply supporse to reads data from final DataTable which has 496 columns.
    
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
    
4

2 に答える 2

2

私は DataRelations を気にせず、単にMergeメソッドを使用します。次に、残りを次のようにハックします...

    'Make all of the DataTables have the same columns.
    For Each dtPrepForMerge As DataTable In FinalDS.Tables

        For Each dtColumnsToGrab As DataTable In FinalDS.Tables

            For Each dc As DataColumn In dtColumnsToGrab.Columns

                'Don't duplicate columns.
                If dtPrepForMerge.Columns(dc.ColumnName) Is Nothing Then

                    dtPrepForMerge.Columns.Add(New DataColumn(dc.ColumnName, dc.DataType))

                End If

            Next

        Next

    Next

    'Now you can merge all of the tables together.
    'The order of the columns don't have to be the same between the tables.
    For intTableMergeCursor As Integer = 1 To (FinalDS.Tables.Count - 1)

        FinalDS.Tables(0).Merge(FinalDS.Tables(intTableMergeCursor))

    Next

    'Clone a new table that will hold your final results.
    Dim dtFinalResult As DataTable = FinalDS.Tables(0).Clone()

    'Sort the rows of your merged table by ID.
    Dim arrSortedDataRows As DataRow() = FinalDS.Tables(0).Select("id > 0", "id")

    Dim intLastID As Integer = CInt(arrSortedDataRows(0).Item("id"))

    Dim drMergedRow As DataRow = dtFinalResult.NewRow()

    For Each dr As DataRow In arrSortedDataRows

        'New ID?
        If CInt(dr.Item("id")) <> intLastID Then

            intLastID = CInt(dr.Item("id"))

            dtFinalResult.Rows.Add(drMergedRow)

            drMergedRow = dtFinalResult.NewRow()

        End If

        For intColumnCursor As Integer = 0 To (dtFinalResult.Columns.Count - 1)

            'Don't overwrite values.
            If Not dr.Item(intColumnCursor) Is DBNull.Value Then

                drMergedRow.Item(intColumnCursor) = dr.Item(intColumnCursor)

            End If

        Next

    Next

    dtFinalResult.Rows.Add(drMergedRow)
于 2012-04-06T21:03:05.030 に答える
0

datatable.columns.add を使用します - http://msdn.microsoft.com/en-us/library/hfx3s9wd.aspx#Y166を参照してください

以下はテストされていないコードで、コンパイルできない可能性がありますが、アイデアはすべてのデータテーブルをループして、列を 1 つの大きなデータテーブルに追加することです。

Dim HugeDT as new datatable

For dt as datatable in FinalDS.DataTables
    For col as datacolumn in dt.Columns
        HugeDT.columns.add (col)
    Next
    'Run a loop on rows of each datatable to copy over the rows.
    'Remember to correlate the recordpointer correctly for each iteration
Next
于 2012-04-06T19:11:58.273 に答える