locked
FAQs:什么可以导致错误“Datatable 的索引已损坏”? RRS feed

  • 问题

  • 为了帮助大家更好地学习 ADO.NET DataSet 技术,微软论坛技术支持团队编辑了一些列的 ADO.NET DataSet 常见问题及解答" 精华帖。

    本帖的主题是:什么可以导致错误“Datatable 的索引已损坏”?

    如果您觉得这个帖子对您的学习、工作有所帮助,请再把这个帖子分享给你的同学、同事和朋友。

    如果您想阅读更多的 "ADO.NET DataSet 常见问题及解答",请打开索引页面:

    http://social.msdn.microsoft.com/Forums/zh-CN/adonetzhchs/thread/f968dfe5-f9e3-4ed0-9c7f-cf26837ea828


    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    2011年2月25日 10:20

答案

  • 导致“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[])添加行。

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

    3)       多线程

     

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

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

     

    例如:DataColumn.DataTypebyte []类型和按照列排序的。如果在byte数组中的值改变而不是制定一个新的byte数组给DataRow,那么内部的索引不知道这样的变化,然后损坏。这是在没有通知内部索引的情况下数据发生改变。

                相关帖子:

                http://social.msdn.microsoft.com/Forums/en/adodotnetdataset/thread/6693db3a-1098-44d4-8b18-6ca85f59b075


    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    2011年2月25日 10:20