导致“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和任何连接的对象都不是线程安全的。请确保您锁定所有合适的对象。
4)
当DataColumn.DataType是一个引用类型,并且值是被更改而不是被当作只读类型来对待的时候。
例如:DataColumn.DataType是byte
[]类型和按照列排序的。如果在byte数组中的值改变而不是制定一个新的byte数组给DataRow,那么内部的索引不知道这样的变化,然后损坏。这是在没有通知内部索引的情况下数据发生改变。
相关帖子:
http://social.msdn.microsoft.com/Forums/en/adodotnetdataset/thread/6693db3a-1098-44d4-8b18-6ca85f59b075
如果您对我们的论坛在线支持服务有任何的意见或建议,请通过
邮件告诉我们。