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
应该在这里完成这项工作,但实际上没有任何反应。
答案 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也可以。