2012-04-06 6 views
2

Я использую базу данных Microsoft Access (просьба не предлагать мне использовать какую-либо другую базу данных, так как у меня нет такого выбора в этой конкретной ситуации). Поскольку таблица базы данных доступа не может содержать более 255 столбцов, я использую метод вертикальной обработки раздела базы данных, в котором я разделил информацию на 5 разных таблиц. Каждая таблица имеет 100 столбцов, а первый столбец - первичный ключ. (Пожалуйста, не предлагайте мне нормализацию базы данных здесь). Теперь мне нужно прочитать данные из этих пяти таблиц, чтобы я мог экспортировать их в файл Excel.Как объединить несколько DataTables в один DataTable.

В других целях для этого я выполнил следующие шаги, но не смог понять, как объединить несколько таблиц.

  1. Я читаю каждую из этих таблиц и помещаю их в отдельный DataTable в тот же DataSet. (Поскольку я использую базу данных Access, я не могу выбрать все столбцы из всех таблиц)

  2. Я объявившие Отношения на этих пять таблицах

  3. Теперь мне нужно, чтобы объединить эти DataTables в один 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 
    
+0

@ HansUp, да, вы правы, мне было любопытно и протестировано с 300 полями. Получить исключение «Слишком много заданных полей» - Удалено мой ответ – Steve

ответ

2

Я would't заморачиваться с 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) 
0

Использование datatable.columns.add - см http://msdn.microsoft.com/en-us/library/hfx3s9wd.aspx#Y166

Ниже приведена непроверенные коды, не может скомпилировать, но идея состоит в том, чтобы перебрать все DataTables и добавить столбцы в один большой DataTable.

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 
+0

Небольшое улучшение было бы использовать HugeDT.Columns.AddRange (dt.Columns), но реальной проблемой является копирование данных здесь. Мы не знаем, сколько записей нужно копировать 5 раз. – Steve

+0

Если между всеми таблицами существует одна связь, она должна быть линейной. У меня нет доступа к редактору, чтобы что-то попробовать, поэтому не мог опубликовать какой-либо связанный код. – Shrieks

Смежные вопросы