如何在Jet SQL中的DataSet中合并两个DataTable?

时间:2014-01-07 01:16:38

标签: sql datatable dataset jet

另一个问题。用这个SQL的东西苦苦挣扎。

我在ADO.NET中从查询生成2个表。我想从这两个表中执行第三个查询 - 在连接数据库中不存在但在数据集中存在。我不能为我的生活弄清楚如何做到这一点。我不想连接到数据库,而是连接到数据集

我看过尝试DataReaders,TableAdapters,DataTable.Select(仅适用于一个表)和其他东西。答案是LINQ for Datasets吗?

由于 安迪

    Dim strSelect As String
    Dim dsmcmd As OleDbDataAdapter          
    Dim dsm as New DataSet

    strSelect = "TRANSFORM Sum(Items.amount) AS total SELECT Accounts.accCategory, Accounts.ID, Accounts.comment AS Account FROM Accounts INNER JOIN Items ON Accounts.ID = Items.accFrom WHERE (((Year([idate]))=2013) AND ((Items.category)<>3 Or (Items.category) Is Null) AND ((Accounts.accCategory)=6 OR (Accounts.accCategory)=7) AND ((Accounts.curr)=1)) GROUP BY Accounts.accCategory, Accounts.ID, Accounts.comment PIVOT Format(idate,'mmm') IN ('Jan','Feb','Mar','Apr', 'May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')"
    dsmcmd = New OleDbDataAdapter(strSelect, cn)
    dsmcmd.Fill(dsm, "Spent")

    strSelect = "TRANSFORM Sum(Items.amount) AS total SELECT Accounts.accCategory, Accounts.ID, Accounts.comment AS Account FROM Accounts INNER JOIN Items ON Accounts.ID = Items.accFrom WHERE (((Year([idate]))=2013) AND ((Items.category)=3) AND ((Accounts.accCategory)=6) AND ((Accounts.curr)=1)) GROUP BY Accounts.accCategory, Accounts.ID, Accounts.comment PIVOT Format(idate,'mmm') IN ('Jan','Feb','Mar','Apr', 'May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')"
    dsmcmd = New OleDbDataAdapter(strSelect, cn)
    dsmcmd.Fill(dsm, "Allocated")        

    strSelect = "SELECT Totals.accCategory, Totals.ID, Totals.Account, Sum(Totals.Jan) AS Jan FROM (SELECT * FROM Allocated UNION SELECT * FROM Spent) AS Totals GROUP BY Totals.accCategory, Totals.ID, Totals.Account"
    dsmcmd = New OleDbDataAdapter(strSelect, <** WHAT DO I PUT HERE **>)
    dsmcmd.Fill(dsm, "Balance")        

1 个答案:

答案 0 :(得分:0)

答案似乎有两个部分。

如果在内存中生成DataTable,则必须使用LINQ

Dim t = (From totals In (allocated.AsEnumerable.Union(spent.AsEnumerable)) _
            Group totals By accCategory = totals.Item("accCategory"), ID = totals.Item("ID"), Account = totals.Item("Account") _
            Into g = Group _
            Select New With {Key .accCategory = accCategory, Key .ID = ID, Key .Account = Account, Key .Jan = g.Sum(Function(totals) If(IsDBNull(totals.Item("Jan")), 0, CDec(totals.Item("Jan"))))}).ToList

然后你必须将它转换回一个表(例如,如果你想将它绑定到DataGrid)

Public Function ToTable(Of T)(data As IList(Of T)) As DataTable

    Dim properties As PropertyDescriptorCollection = TypeDescriptor.GetProperties(GetType(T))
    Dim table As New DataTable()

    For Each prop As PropertyDescriptor In properties
        table.Columns.Add(prop.Name, If(Nullable.GetUnderlyingType(prop.PropertyType), prop.PropertyType))
    Next

    For Each item As T In data
        Dim row As DataRow = table.NewRow()
        For Each prop As PropertyDescriptor In properties
            row(prop.Name) = If(prop.GetValue(item), DBNull.Value)
        Next
        table.Rows.Add(row)
    Next

    Return table

End Function

唯一突出的问题是Null(DBNull)处理 - 但我会发布一个单独的问题。

安迪