DataTable内部索引已损坏:'5'。用于线程

时间:2011-06-30 06:02:34

标签: c# .net

我使用了在多个线程之间共享的静态全局数据集。

我遇到以下异常:

  

数据表内部索引是   腐败:'5'。

在线程中,我从数据表&读取值。更新(使用合并)数据表中的值,两个操作都在线程中完成。

7 个答案:

答案 0 :(得分:2)

您正在对来自不同线程的数据集执行操作。

数据集不是线程安全的,您应该创建一个wrapper class来保护数据集,使其不会超过1次操作。这称为互斥:

link to microsoft msdn

更好的解决方案是根本不使用全局状态。这将解决您的问题,无需任何额外的工作,使您的代码更可靠。

答案 1 :(得分:1)

如果您正在使用带有数据集的线程,则会发生该错误。

就我而言,我试图在一个在线程中运行的方法中为数据集创建一个新行。

一种方法是使用 SyncLock 围绕创建行的方法或其他方式(可能更好)是在线程外创建行。

基本上我的代码看起来像这样:

    Dim elements As New List(Of element)
    Dim dataRows As New List(Of MyDataSet.Row)

    For i As Integer = 0 To elements.Count - 1
        dataRows.Add(Me.Ds.Elements.NewElementsRow)
    Next

    Parallel.For(0, elements.Count, Sub(i As Integer)
                                        Me.CreateElementRow(elements(i), dataRows(i))
                                    End Sub)

CreateElementRow 方法中,我在线程中进行了大量计算。

希望这有帮助。

答案 2 :(得分:0)

好吧,因为您在多个线程中使用dataTable,所以如果您从不同的线程操作对象,则很可能会出现损坏。

可帮助您解决问题的一些提示:

  • 避免使用默认视图,和 修改默认视图if 可能。顺便说一句,.Net 2.0有一个数字 读/写锁定创建 观点,所以他们不是问题 是2.0之前。
  • 尽可能调用AcceptChanges()。
  • 小心。选择(表达), 因为没有读/写锁 在这段代码中 - 它是唯一的 地方(至少根据一个人而言) 在usenet上,所以拿它来一粒 盐 - 但是,这是非常的 类似于你的问题 - 所以使用 互斥体可以帮助)
  • 将AllowDBNull设置为中的列 问题(值得怀疑,但是 在usenet上报道 - 我用过 它只在它制造的地方 义)
  • 确保您没有设置 null(C#)/ Nothing(VB)到DataRow 领域。使用DBNull.Value而不是 空值。在你的情况下,你可能希望 检查该字段是否为空,即 表达式语法确实支持 IsNull(val,alt_val)运算符。
  • 这可能对我有所帮助 (听起来很荒谬):如果值是 不改变,不要分配。例如,如果要为某些列指定值,请将其作为:
if (column.Expression != "some expression") 
      column.Expression = "some expression"; 

答案来源:StackOverflow - DataTable internal index is corrupted

答案 3 :(得分:0)

这就是我修复内部索引是如何损坏的问题:

System.Data.DataTable dtNew = new DataTable();
for (int iCol = 0; iCol < dtOriginalData.Columns.Count; iCol++)
{
    dtNew.Columns.Add(dtOriginalData.Columns[iCol].ColumnName, dtOriginalData.Columns[iCol].DataType);
}
for (int iCopyIndex = 0; iCopyIndex < item.Data.Rows.Count; iCopyIndex++)
{
    dtNew.Rows.Add(dtOriginalData.Rows[iCopyIndex].ItemArray);
    //dtNew.ImportRow(dtOriginalData.Rows[iCopyIndex]);
}
dtOriginalData = dtNew;

答案 4 :(得分:0)

可能是你在同一时间在多个进程中使用相同的数据表..我刚刚使用SYNCLOCK解决了这个问题..

试试这个..

SyncLock your datatable

'''' -------your datatable process

End SyncLock

如果这对你有帮助,请告诉我..

快乐编码..

答案 5 :(得分:0)

为了防止在我使用的多个线程中执行:

Application.Lock();
--- do your stuff in the datatable
Application.UnLock();

答案 6 :(得分:0)

DataTable.BeginLoadData();

// Do MultiThreaded Inserts

DataTable.EndLoadData(); 
DataTable.AcceptChanges();

这将解决您的问题