相信有不少人遇到過這個問題,筆者也曾經被這個問題困擾過。
差了不少資料,有的人說是.Net Framework版本導致的。這裏我想說的是不是的,基本與版本唔關,因爲1.0、1.1、2.0、3.5都是可以重現問題的。
導致“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,
那麼內部的索引不知道這樣的變化,然後損壞。這是在沒有通知內部索引的情況下數據發生改變。
例子To be continued。。。