關於DataTable內部索引已損壞的問題

相信有不少人遇到過這個問題,筆者也曾經被這個問題困擾過。

差了不少資料,有的人說是.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。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章