关于DataTable内部索引已损坏的问题 System.Data.RBTree
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的更多相关文章
- C# 数据库写入Sql Bulk索引损坏异常问题System.InvalidOperationException: DataTable internal index is corrupted: '4'
C# 数据库写入Sql Bulk索引损坏异常问题 System.InvalidOperationException: DataTable internal index is corrupted: '4 ...
- 转:"在已损坏了程序内部状态的XXX.exe 中发生了缓冲区溢出"的一种可能原因
我的问题跟原作者的问题差不多.头文件和DLL不匹配导致的. 原文链接:http://blog.csdn.net/u012494876/article/details/39030887 今天软件突然出现 ...
- Sql Server尝试读取或写入受保护的内存。这通常指示其他内存已损坏
今日遇到这样一个问题,用vs2010调试C#代码时,只要代码一运行到跟数据库关联的地方时,编译器就报错误,给的提示如:调试器已附加,要继续需要分离什么的,咋一看还以为是vs中调试器设置的问题,可后来仔 ...
- SqlServer索引页损坏恢复
问题背景 运维操作失误,在没有正常关闭sqlserver的情况下,将服务器关闭了,重启后某些表损坏(应该是某些页损坏了,没有损坏的页还能访问到数据,但是访问损坏了的页就有问题),目前数据库只有4.20 ...
- 数据库页已标记为 RestorePending,可能表明磁盘已损坏。要从此状态恢复,请执行还原操作。
错误提示: 消息 829,级别 21,状态 1,第 1 行 数据库 ID 15,页 (1:21826) 已标记为 RestorePending,可能表明磁盘已损坏.要从此状态恢复,请执行还原操作. 引 ...
- windows7 Sql server 2012 尝试读取或写入受保护的内存。这通常指示其他内存已损坏的修复
项目中,使用了sql server2012数据库,服务端是2012,客户端如果是2008的话,就会报错: 索引错误. 没办法,就安装了sql server2012客户端.但是还是报错,无法连上数据库服 ...
- 关于C#调用非托管DLL,报“内存已损坏的”坑,坑,坑
因客户需求,与第三方对接,调用非托管DLL,之前正常对接的程序,却总是报“内存已损坏的异常”,程序进程直接死掉,折腾到这个点(2018-05-11 00:26),终于尘埃落定,直接上程序. 之前的程序 ...
- 日常关键字:定时关机、该任务映像已损坏或已篡改.(0x80041321)、ChaZD生词同步扇贝
我在床上用chinanet网络慢得简直令人发指,12B/S.是的你没有看错,这是我最常看到的网速.但是我最近发现电脑联网开出一个WiFi,在床上用手机上网时,网速会一点提升,可达到1KB/S(⊙﹏⊙) ...
- SQL Server Reporting Services:无法检索应用程序文件。部署中的文件已损坏
如果在客户端计算机上启动Microsoft SQL Server 2012的 ClickOnce 版本的 Microsoft SQL Server 报表生成器时出现"无法检索应用程序文件.部 ...
随机推荐
- 【UOJ#389】【UNR#3】白鸽(欧拉回路,费用流)
[UOJ#389][UNR#3]白鸽(欧拉回路,费用流) 题面 UOJ 题解 首先第一问就是判断是否存在一条合法的欧拉回路,这个拿度数和连通性判断一下就行了. 第二问判断转的圈数,显然我们只需要考虑顺 ...
- Pandas 学习 第9篇:DataFrame - 数据的输入输出
常用的数据存储介质是数据库和csv文件,pandas模块包含了相应的API对数据进行输入和输出: 对于格式化的平面文件:read_table() 对于csv文件:read_csv().to_csv() ...
- MySQL for OPS 01:简介 / 安装初始化 / 用户授权管理
写在前面的话 取这个标题的目的很简单,MySQL 在中小型企业中一般都是由运维来维护的,除非数据很重要的公司可能会聘请 DBA. 但是运维一般存在由于所需要了解的东西很多很杂,导致学习过程中很多东西只 ...
- 实验6:Mapreduce实例——WordCount
实验目的1.准确理解Mapreduce的设计原理2.熟练掌握WordCount程序代码编写3.学会自己编写WordCount程序进行词频统计实验原理MapReduce采用的是“分而治之”的 ...
- Mysql EF Core 快速构建 Web Api
(1)首先创建一个.net core web api web项目; (2)因为我们使用的是ef连接mysql数据库,通过NuGet安装MySql.Data.EntityFrameworkCore,以来 ...
- swift开发之--简单封装Alamofire请求类以及简单使用SnapKit
以前在swift3的时候,写过类似的,那个时候还没有很成熟的网络请求类库,在这里,还是衷心感谢大神们的付出! 具体效果如下,先上图: 点击按钮的时候,请求数据,数据结构如下: { ; reason = ...
- 【已采纳】新项目第一次怎么上传到github里面
言归正传,最近学习了怎么将新创建的本地代码上传到github上,这里简单的记录一下,我喜欢使用命令行,这里全用命令行来实现,不了解git命令的可以去了解下. 第一步:建立git仓库 cd到你的本地 ...
- hashlib以及hmac的日常应用
首先我们要明白日常的Web网页为了保证数据的安全都会对数据的存储进行一些加密,当我需要在此网站验证时就需要对原有的密码以及账号进行加密此时我们就需要用到hashlib这个框架的一些功能,下面我就来更大 ...
- Java垃圾回收。
一:如何确定哪些对象应该被回收. 1.引用记数法.在对象中添加一个引用计数器,每当有一个地方引用它时,计数器加一,引用失效时,计数器减一,当计数器为0时,该对象是不可用的. i:缺陷:会产生循环 ...
- Tomcat部署项目时,发布的项目页面部分乱码,且页面渲染文件也是乱码。
catalina.bat中必须设置为UTF-8,如果我不设置为UTF-8,页面接收到的就是乱码了,尝试过各种UTF-8的调试,都无解,最后还是只能在catalina.bat的set "JAV ...