1、错误提示:

最近,Winform程序在极其偶然的情况下会遇到如下错误提示

Framework 版本: v4.0.30319
说明: 由于未经处理的异常,进程终止。
异常信息: System.InvalidOperationException
堆栈:
在 System.Data.RBTree`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].RBDeleteX(Int32, Int32, Int32)
在 System.Data.RBTree`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].DeleteByIndex(Int32)
在 System.Data.Index.RecordStateChanged(Int32, System.Data.DataViewRowState, System.Data.DataViewRowState, Int32, System.Data.DataViewRowState, System.Data.DataViewRowState)
在 System.Data.DataTable.RecordStateChanged(Int32, System.Data.DataViewRowState, System.Data.DataViewRowState, Int32, System.Data.DataViewRowState, System.Data.DataViewRowState)
在 System.Data.DataTable.SetNewRecordWorker(System.Data.DataRow, Int32, System.Data.DataRowAction, Boolean, Boolean, Int32, Boolean, System.Exception ByRef)
在 System.Data.DataTable.SetNewRecord(System.Data.DataRow, Int32, System.Data.DataRowAction, Boolean, Boolean, Boolean)
在 System.Data.DataRow.EndEdit()
在 System.Data.DataRow.set_Item(System.Data.DataColumn, System.Object) 

相信有不少人遇到过这个问题,老王也被这个问题困扰了一个星期了。

差了不少资料,此问题基本与版本无关,因为1.0、1.1、2.0、3.5、4.0、4.5都是可以重现问题的。

2、导致“Datatable 的索引已损坏”发生的原因有四种。

(1)在DataView.ListChanged 事件的时候改变值。这是不支持的。

来看一下调用堆栈,如果你看到DataView.OnListChanged,你正在更改一个DataRow/Set/Table,这时很可能会发生索引损坏(即被DataRow.EndEdit抛出)。

简短描述一下这个问题:内部索引得到编辑out-of-order的消息。

解决方法-使用DataTable.RowChanged事件,而不是DataView.ListChanged事件。

(2)当合并数据到已经存在的DataRow时候仍然有一些没有修复的漏洞, 这个是在Added或者Deleted状态下开始,并在Modified行状态的时候结束。

当 LoadOption.PreserveChanges事件发生时,调用DataAdapter.Fill, DataSet.Load, DataTable.Load事件。

用DataSet.Merge, DataTable.Merge来删除行。

用DataSet.Merge (DataRow[])添加行。

简单描述问题:当DataTable让DataView “添加”而不是“修改”时,导致索引损坏。

(3)多线程

DataSet/ DataTable和任何连接的对象都不是线程安全的。请确保您锁定所有合适的对象。

我的问题属于此类,因为我在多线程中都有操作DataTable,然后,看了这篇帖子,我在所有操作DataTable的地方都加入了Lock语句,然后问题解决了!

感谢此文作者 GR_king,原文网址:http://blog.51cto.com/gleolee/1911134

lock (datatable)
{
针对datatable的操作
}

(4)当DataColumn.DataType是一个引用类型,并且值是被更改而不是被当作只读类型来对待的时候。

例如:DataColumn.DataType是byte []类型和按照列排序的。如果在byte数组中的值改变而不是制定一个新的byte数组给DataRow,

那么内部的索引不知道这样的变化,然后损坏。这是在没有通知内部索引的情况下数据发生改变。

本文非原创,转自:https://blog.csdn.net/deboywang/article/details/84070501

关于DataTable内部索引已损坏的问题 System.Data.RBTree的更多相关文章

  1. C# 数据库写入Sql Bulk索引损坏异常问题System.InvalidOperationException: DataTable internal index is corrupted: '4'

    C# 数据库写入Sql Bulk索引损坏异常问题 System.InvalidOperationException: DataTable internal index is corrupted: '4 ...

  2. 转:"在已损坏了程序内部状态的XXX.exe 中发生了缓冲区溢出"的一种可能原因

    我的问题跟原作者的问题差不多.头文件和DLL不匹配导致的. 原文链接:http://blog.csdn.net/u012494876/article/details/39030887 今天软件突然出现 ...

  3. Sql Server尝试读取或写入受保护的内存。这通常指示其他内存已损坏

    今日遇到这样一个问题,用vs2010调试C#代码时,只要代码一运行到跟数据库关联的地方时,编译器就报错误,给的提示如:调试器已附加,要继续需要分离什么的,咋一看还以为是vs中调试器设置的问题,可后来仔 ...

  4. SqlServer索引页损坏恢复

    问题背景 运维操作失误,在没有正常关闭sqlserver的情况下,将服务器关闭了,重启后某些表损坏(应该是某些页损坏了,没有损坏的页还能访问到数据,但是访问损坏了的页就有问题),目前数据库只有4.20 ...

  5. 数据库页已标记为 RestorePending,可能表明磁盘已损坏。要从此状态恢复,请执行还原操作。

    错误提示: 消息 829,级别 21,状态 1,第 1 行 数据库 ID 15,页 (1:21826) 已标记为 RestorePending,可能表明磁盘已损坏.要从此状态恢复,请执行还原操作. 引 ...

  6. windows7 Sql server 2012 尝试读取或写入受保护的内存。这通常指示其他内存已损坏的修复

    项目中,使用了sql server2012数据库,服务端是2012,客户端如果是2008的话,就会报错: 索引错误. 没办法,就安装了sql server2012客户端.但是还是报错,无法连上数据库服 ...

  7. 关于C#调用非托管DLL,报“内存已损坏的”坑,坑,坑

    因客户需求,与第三方对接,调用非托管DLL,之前正常对接的程序,却总是报“内存已损坏的异常”,程序进程直接死掉,折腾到这个点(2018-05-11 00:26),终于尘埃落定,直接上程序. 之前的程序 ...

  8. 日常关键字:定时关机、该任务映像已损坏或已篡改.(0x80041321)、ChaZD生词同步扇贝

    我在床上用chinanet网络慢得简直令人发指,12B/S.是的你没有看错,这是我最常看到的网速.但是我最近发现电脑联网开出一个WiFi,在床上用手机上网时,网速会一点提升,可达到1KB/S(⊙﹏⊙) ...

  9. SQL Server Reporting Services:无法检索应用程序文件。部署中的文件已损坏

    如果在客户端计算机上启动Microsoft SQL Server 2012的 ClickOnce 版本的 Microsoft SQL Server 报表生成器时出现"无法检索应用程序文件.部 ...

随机推荐

  1. [Flutter] Windows桌面程序开发

    在今年5月的谷歌I/O 2019大会时, 谷歌就宣布了flutter已经支持全平台开发, 包括 android, ios, mac, linux, windows, web 等 . Flutter桌面 ...

  2. C# NPOI Export DataTable C# NPOI导出DataTable 单元格自适应大小

    1.Install-Package NPOI -v 2.4.0 2. using NPOI.XSSF; using NPOI.XSSF.UserModel; using NPOI.SS.UserMod ...

  3. js变量--全局变量和局部变量

    1.javaScript中在函数里声明的变量为局部变量,其余为全局变量. 2.javaScript没有块级元素

  4. Python对csv排序

    #/usr/bin/evn python # -*- coding: utf-8 -*- import sys from operator import itemgetter # input_file ...

  5. array list 的特点及几种遍历方法

    public class temp { public static void main(String[] args)throws Exception { //ArrayList 在定义时长度为空 ,在 ...

  6. Windows 下MongoDB复制集配置

    1.下载服务.https://www.mongodb.com/   点击products 下拉第二列MongoDB server  选择 4.0.6 2.下载下来后 有限管理员运行 一路安装,可以不用 ...

  7. 斗鱼刷弹幕js代码

    对于一个网络喷子(like me)来说,喷人必须高效. var script=document.createElement("script"); script.type=" ...

  8. NBIOT实现UDP协议的发送和接收(包含软件升级)

    源码下载: nbiot_module程序(java netbean) -> 提取码 UdpServer程序(C# vs2010) -> 提取码 QQ:505645074 前提条件:开NB卡 ...

  9. 解决eclipse中maven多模块项目显示不全的问题

    背景:在eclipse中导入maven项目,后来发现有的子模块不能正常的显示出现 原因:没有加载到子模块的pom文件 解决方法:重新导入:import-> 勾选项目->选择你缺少的项目的p ...

  10. pdfium 保存pdf

    // // Created by svenj on 2019/2/3. // extern "C" { #include <unistd.h> #include < ...