【问题标题】:Exception was thrown when adding new rows to datatable向数据表添加新行时引发异常
【发布时间】:2011-04-01 14:48:00
【问题描述】:
  • listA 是整数列表

  • dtListB 是数据表

我正在检查是否 ListA 的 StudentId 在 dtListB 中不存在,然后将其添加到 dtListB。

将 stidListA、stIdListB 调暗为整数

    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})

有什么建议吗?谢谢。

【问题讨论】:

  • 我不是 VB.net 人,但在我看来,这个错误就像你的循环是无限的。

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


【解决方案1】:

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

【讨论】:

  • 是的,你是对的。我必须将 dtListB.Rows.Add 移出它的循环。
【解决方案2】:

问题是您并没有真正检查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)

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

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

For Each la In listA
    stidListA = la.StudentId

    Dim itemFound as Boolean = False

    For n = 0 To dtListB.Rows.Count - 1 Step 1
        stIdListB = dtListB.Rows(n)("StudentId")
        If stIdListB <> stidListA Then
            itemFound = True
            Break //(is there Break in VB?)
        End If
    Next

    If Not itemFound Then
        dtListB.Rows.Add(New Object() {la.StudentId, la.AssignedId, la.TimeSheetId, 0})
    End If
Next

【讨论】:

  • 是的,为找到的项目声明一个变量便于以后操作数据表。无论如何,VB.NET 中没有 Break 而是 Exit For。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多