从List(Of TableRow)ImportRow到新的数据集

时间:2014-03-19 21:43:52

标签: dataset strongly-typed-dataset

ImportRow无效。

我意识到这个主题已被覆盖了一百次,但谷歌以前的答案似乎都没有触及我的情况。

我有一个名为MessageRecords的DataTable。在其中,我有一个名为Messages的表。在THAT中,我的行名为MessagesRow

在一个名为CombineRows()的特定函数中,我有以下代码:

Private Sub CombineRows()
    Dim dtsMessage As New MessageRecords
    Dim MsgList As List(Of MessageRecords.MessagesRow)) = GetMessages()

    For Each Msg In MsgList
        dtsMessage.Messages.ImportRow(Msg)
        . . . 'Do More
    Next
    . . . 'Do More
End Sub

我还尝试了dtsMessage.Messages.Rows.Add(Msg)dtsMessage.Messages.AddMessagesRow(Msg),但这给了我ArgumentException:“此行已经属于另一个表。”

我还尝试添加dtsMessage.Messages.AcceptChanges()dtsMessage.AcceptChanges(),但它们没有任何效果。

另请注意:如果我在dtsMessage.Messages.ImportRow(Msg)处断点,我可以“观察”'Msg'它,它是一个合法的MessagesRow,包含我所有预期的信息。

但当我走到For Each的下一行时,dtsMessage.Messages.Rows.Count仍为零。没有错误。

我以前的工作代码在同一个函数中构建了MessageRows(函数类似于200行),并将每个MessageRow构建为新的dtsMessage.Messages.NewMessagesRow() 。所以AddMessagesRow工作正常。但是在转向单一责任方法进行单元测试时,我将构建消息行的代码放入GetMessages()函数中。它比我看起来更复杂,或者我会把它包含在循环中。

所以现在行列表没有与表关联,我不能Add。据说ImportRow应该在这里完成这项工作,但实际上没有任何反应。

1 个答案:

答案 0 :(得分:0)

这里的问题在于我在另一个函数中创建了List(Of MessageRow)。有技术没有没有DataTable的TableRow。除非您在我的错误代码中看到,否则您可以拥有List(Of MessageRow)

但幕后发生的事情,我认为这是.NET Framework中的一个缺陷,就是每个MessageRow TableRow都是作为它自己的单一MessageRecords数据集的一部分创建的,它是自己的单Messages表。

所以在GetMessages()函数中,我基本上有这个伪代码:

Dim lstMessages As New List(of MessageRow)
For Each Item In QueryResults
    Dim dtt As New MessageRecords
    Dim dr As MessageRecords.MessageRow = dtt.Messages.NewMessageRow
    . . . 'Do Stuff
    lstMessages.Add(dr)
Next
Return lstMessages

但是当List(Of MessageRow)回到我的调用方法时,Rows是从原来的dtt表中孤立的。

因此,即使出于某种原因,我可以访问并“监视”每个行,并且它们在那里是合法的......事实上它们的原始父数据集/数据表现在已经丢失,.NET Framework(用于某些原因)不知道如何错误或ImportRow ...所以根本没有发生任何事情。

我的解决方案是将我的列表更改为List(Of MessageRecords)数据集,然后在我的主CombineRows()函数中,我改变了我的循环:

Private Sub CombineRows()
    Dim dtsMessage As New MessageRecords
    Dim MsgList As List(Of MessageRecords)) = GetMessages()

    For Each MsgDataset In MsgList
        dtsMessage.Messages.ImportRow(MsgDataset.Tables(0).Rows(0))
        . . . 'Do More
    Next
    . . . 'Do More
End Sub

现在我没有孤立的行,而且ImportRow也可以。