当前位置: 代码迷 >> ASP.NET >> 怎么解决?DataTable 内部索引已损坏.
  详细解决方案

怎么解决?DataTable 内部索引已损坏.

热度:3631   发布时间:2013-02-25 00:00:00.0
如何解决?DataTable 内部索引已损坏...
网站代码中用到了DataView,但是,会出现以下问题:

当前异常的消息                   :   DataTable   internal   index   is   corrupted:   '13 '.
引发当前异常的类名           :   System.Data.RBTree`1
引发当前异常的方法名       :   GetNodeByIndex

开发阶段从未出现过,只是在网站部署之后才出现,而且,相当郁闷的是,有时候有这问题,有时候没这问题。确切的说,是在网站刚部署时候没有,过些日子,问题开始出现,这个时候重新传一下程序集,或者重新启动网站,状况就会消失,过段时间,它还会出现。而且,越来越频繁......

希望遇到过次问题的前辈们不吝赐教....谢谢了先...

.NET2.0下运行。

------解决方案--------------------------------------------------------
没代码谁也帮不了你
------解决方案--------------------------------------------------------
好像是你的代码中某个地方修改了DataTable数据,。采用static定义的变量或者往往会有这样的问题
------解决方案--------------------------------------------------------
由于性能原因,DataTable 没有设计成线程安全的,解决这个问题,可以在修改数据的时候采用lock语句

这里的修改包括:
1,添加,删除,修改DataTable的行
2,使用DataTable 的Select方法选择行,这会通过创建索引从而修改DataTable
3,在DataTable上创建DataViews ,也会导致重建索引
4,修改Sort属性也会导致DataTable的修改。


If you modify a DataTable on multiple threads, you can corrupt the indexes on it and this is by design. The DataTable is not designed to be thread safe for modifications for performance reasons. So to resolve this you need to use the lock statement around all modifications to DataTable.

Modifications include:

1. Adding, deleting, modifying rows in DataTable.

2. Selecting rows using Select method on DataTable (yes, this can modify the DataTable by creating a new index on it).

3. Creating DataViews over a DataTable (same as #2, this can cause a new index to be created on DataTable).

4. Modifying Sort property.

I am sure there are some others I missed. In general using the same DataTable on multiple threads is tricky business unless you restrict DataTable to100% read only operations (like enumerating rows and reading values).


------解决方案--------------------------------------------------------
当尝试使用的由 DataTable 对象, 使用 DataSet 对象 AcceptChanges 方法并且您设置到 AcceptRule.Cascade , ForeignKey 规则所使用的 DataSet 对象内部索引值可能损坏。
如果下列条件为真会发生此问题:
• DataSet 对象包含一个或多个表具有到一对多关系。
• 调用 AcceptChanges 方法的 DataSet 对象。
&#8226; DataSet 对象的 < A0 > AcceptRejectRule < / A0 > 值设置为层叠。 当此值设为层叠, 子表将更改以便它自动或者接受数据或者拒绝数据。

这段代码不知道对你有没有帮助

public void Main()
{
DataTable Table = new DataTable( "Employee ");
Table.Columns.Add( "Id ", typeof(int));
Table.Columns.Add( "ManagerId ", typeof(int));
Table.Columns.Add( "Name ", typeof(string));

Table.Columns[ "Name "].AllowDBNull = false;
Table.PrimaryKey = new DataColumn[] {Table.Columns[ "Id "]};

DataSet Employees = new DataSet();
Employees.Tables.Add(Table);

DataRelation rel = Employees.Relations.Add(Table.Columns[ "ID "], Table.Columns[ "ManagerId "]);
rel.ChildKeyConstraint.AcceptRejectRule = AcceptRejectRule.Cascade;

DataRow ManagerA = Table.NewRow();
ManagerA[ "ID "] = 2019;
ManagerA[ "Name "] = "Manager A ";
Table.Rows.Add(ManagerA);

DataRow ManagerB = Table.NewRow();
ManagerB[ "ID "] = 392;
ManagerB[ "Name "] = "Manager B ";
Table.Rows.Add(ManagerB);

DataRow EmployeeB = Table.NewRow();
EmployeeB[ "ID "] = 716;
EmployeeB[ "Name "] = "Employee of B ";
EmployeeB.SetParentRow(ManagerB);
Table.Rows.Add(EmployeeB);
  相关解决方案