向datatable添加新行时抛出异常

时间:2010-08-20 11:23:33

标签: vb.net linq .net-3.5 datatable

  • listA是整数列表

  • dtListB是DataTable

我正在检查如果listA的StudentId在dtListB中不存在,则将其添加到dtListB。

Dim stidListA,stIdListB As Integer

    For Each la In listA
        stidListA = la.StudentId

        For n = 0 To dtListB.Rows.Count - 1 Step 1
            stIdListB = dtListB.Rows(n)("StudentId")
            If stIdListB <> stidListA Then
    dtListB.Rows.Add(New Object() {la.StudentId, la.AssignedId, la.TimeSheetId, 0})
            End If
        Next
    Next

我不确定为什么会抛出错误:

  

抛出了类型'System.OutOfMemoryException'的异常。

dtListB.Rows.Add(New Object(){la.StudentId,la.AssignedId,la.TimeSheetId,0})

有什么建议吗?感谢。

2 个答案:

答案 0 :(得分:1)

您正在使用dtListB.Rows进行迭代并插入dtListB.Rows。它正在增加Count并且只是在不确定的时间内循环。

答案 1 :(得分:0)

问题是你没有真正检查if StudentId of ListA doesn't exist in dtListB。您的代码实际上做的是将dtListB中的 EVERY 元素与ListA中的当前元素进行比较,如果它们不相同,则会向dtListB添加新行。所以假设您有以下列表:

ListA = { 3, 4 };
dtListB = { 1, 2, 3 };

ListA的第一次迭代,值为3

Check: (3 <> 1) and add '3' to dtListB (dtListB = { 1, 2, 3, 3 })
Check: (3 <> 2) and add '3' to dtListB (dtListB = { 1, 2, 3, 3, 3 })
Check: (3 <> 3) and don't do anything.
(Since the list has grown, you have two more iterations)

对于值ListA的{​​{1}}的第二次迭代,您将为与之比​​较的现有数组的每个元素插入5次,并获得结果列表:4。显然,这不是你期望的结果,你可能有更大的列表和内存不足。

我建议在循环{ 1, 2, 3, 3, 3, 4, 4, 4, 4, 4 }时保留Boolean标记itemFound。在循环之前将其设置为dtListB,如果遇到匹配项,请将其设置为False。在循环之后,检查True是否为itemFound,如果是,请将该项添加到列表中。这可能不是有效的VB语法,但你明白了:

False