如何解决?DataTable 内部索引已损坏...

alwaysLonely 2007-08-27 07:50:35
网站代码中用到了DataView,但是,会出现以下问题:

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

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

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

.NET2.0下运行。
...全文
1576 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
alwaysLonely 2008-12-13
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 hellomartin 的回复:]
不得不说,像楼主这种类型的是最恶心的。
有个问题提出来了,自己搞了半天解决了。怎么解决的就是不说。
那来这上面问个屁啊。
怒!
[/Quote]

见过2的,没见过你这么2的,我没说么?你自己2就算了,别瞎说好不好?我就不告诉你,咋地了?就你这德行,饿死最好.
hellomartin 2008-12-13
  • 打赏
  • 举报
回复
不得不说,像楼主这种类型的是最恶心的。
有个问题提出来了,自己搞了半天解决了。怎么解决的就是不说。
那来这上面问个屁啊。
怒!
xixiAA2008 2008-10-13
  • 打赏
  • 举报
回复
请问楼主是如何解决的?谢谢
alwaysLonely 2007-08-29
  • 打赏
  • 举报
回复
已解决```谢谢各位了
honey52570 2007-08-28
  • 打赏
  • 举报
回复
mark
ReyZhang 2007-08-28
  • 打赏
  • 举报
回复
顶一下
gameboy766 2007-08-28
  • 打赏
  • 举报
回复
Mark
wxlwxlwxlwxl 2007-08-28
  • 打赏
  • 举报
回复
不会,帮顶.
LutzMark 2007-08-28
  • 打赏
  • 举报
回复
有可能是什么第三方控件造成的
Jinglecat 2007-08-28
  • 打赏
  • 举报
回复
也主要是用select收集数据然后作为其他模块select的源数据
========
1.
需要注意的是,在修改 DataView 任何 Sort、RowFilter 或 RowStateFilter 属性时都会重新生成 DataView 的索引,“这看起来是一个只读的过程,但内部相关架构显然不是如此”

也许,你将 DataView 放入了诸如 Application Cache 之类的对象,多用户查询过程设置了 RowFilter 之类属性 ....

2.
此问题,“看似已被当作 BUG”,已经有人提交,但没有官方回复
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=98279#Workarounds


3.
lock 语句使用请参卡:
http://msdn2.microsoft.com/zh-cn/library/c5kehkcz(VS.80).aspx


4.
孟子老大 提供的信息是来自一位 MSFT 成员在 forums.microsoft.com 的 .NET 数据访问 版块的一个【相同问题】的回复(此人为版主)
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=277680&SiteID=1

因此,良好的解决问题+学习方式是【学会自己寻找资源】,
当然我无法确定 LZ 是否 baidu/google 过


Good Luck!
dongwei2345 2007-08-27
  • 打赏
  • 举报
回复
当尝试使用的由 DataTable 对象, 使用 DataSet 对象 AcceptChanges 方法并且您设置到 AcceptRule.Cascade , ForeignKey 规则所使用的 DataSet 对象内部索引值可能损坏。
如果下列条件为真会发生此问题:
• DataSet 对象包含一个或多个表具有到一对多关系。
• 调用 AcceptChanges 方法的 DataSet 对象。
• 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);

EmployeeB = Table.NewRow();
EmployeeB["ID"] = 637;
EmployeeB["Name"] = "2nd employee of B";
EmployeeB.SetParentRow(ManagerB);
Table.Rows.Add(EmployeeB);

Employees.AcceptChanges();
Table.Rows.Find(392).Delete();
Employees.AcceptChanges();
}
孟子E章 2007-08-27
  • 打赏
  • 举报
回复
由于性能原因,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).

alwaysLonely 2007-08-27
  • 打赏
  • 举报
回复
谢谢LS的回答先

这个DataView在这里的作用是作为一些短时间内不可能修改的数据的缓存机制。

除了创建它的函数是static函数以外,并没有其他地方与static有关联。而且,也主要是用select收集数据然后作为其他模块select的源数据。这个是不允许修改的。
孟子E章 2007-08-27
  • 打赏
  • 举报
回复
好像是你的代码中某个地方修改了DataTable数据,。采用static定义的变量或者往往会有这样的问题
alwaysLonely 2007-08-27
  • 打赏
  • 举报
回复
我倒```代码这里是贴不下了,这是.net2.0一直都有的一个问题,只是以前我并没有找到什么解决方案而已,如果你遇到过,解决过,我贴代码也多余,要是没解决过,贴了代码也不是几天就是解决的,我就想求个解决方案的思路,就没指望有人能直接什么都帮我做了....

不过,谢谢2楼了,至少有心帮我,呵呵,谢谢您了先。
Avoid 2007-08-27
  • 打赏
  • 举报
回复
没代码谁也帮不了你
alwaysLonely 2007-08-27
  • 打赏
  • 举报
回复
顶个....饿肚子等待中...

62,052

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧