当前位置:编程学习 > C#/ASP.NET >>

关于DataTable.Select(string filterStr)问题, 抛出stack overflow异常

数据源DataTable  dt, 300条数据。   需要过滤的ID哈希表 - HashTable requestIDs, 其中value是对应的ID。


StringBuilder sb = new StringBuilder();

foreach (DictionaryEntry de in requestIDs)
{
   sb.Append("ID<>" + de.Value.ToString() + " AND ");
}

filterStr = sb.ToString() + "ID<>-1";  //动态生成过滤条件, "ID<>-1"设置一个永远为True来补齐

DataRow[] dtRows = dt.Select(filterStr);  //当filterStr过滤的ID个数超过80个,runtime error - stack overflow exception,  少于80个则正常!



An unhandled exception of type 'System.StackOverflowException' occurred in System.Data.dll

有Google找答案, 但觉得没有合适的,完善的解决方案。 
多数是建议 --- 拆分过滤条件,多次select。

请大神指教小弟, 困扰几天了。

不要说什么Linq等等之类的东东, 我是在SharePoint平台的项目, 都是用DataTable存放数据的!  多分感谢。。。。。   跪求大神了!! --------------------编程问答-------------------- 杀花 --------------------编程问答-------------------- 是否考虑 ID not in(xxx,xxxx,xxxx,xxx)的写法,出错的原因不太清楚,你的判断表达式太长了,导致堆栈溢出了~ --------------------编程问答-------------------- select里面的条件太多了,可以分步计算啊。再说了有那么多条件为什么不在数据库里筛选好了,而在本机内存中频繁的计算呢? --------------------编程问答--------------------
引用 楼主 u013069803 的回复:
数据源DataTable  dt, 300条数据。   需要过滤的ID哈希表 - HashTable requestIDs, 其中value是对应的ID。


StringBuilder sb = new StringBuilder();

foreach (DictionaryEntry de in requestIDs)
{
   sb.Append("ID<>" + de.Value.ToString() + " AND ");
}

filterStr = sb.ToString() + "ID<>-1";  //动态生成过滤条件, "ID<>-1"设置一个永远为True来补齐

DataRow[] dtRows = dt.Select(filterStr);  //当filterStr过滤的ID个数超过80个,runtime error - stack overflow exception,  少于80个则正常!



An unhandled exception of type 'System.StackOverflowException' occurred in System.Data.dll

有Google找答案, 但觉得没有合适的,完善的解决方案。 
多数是建议 --- 拆分过滤条件,多次select。

请大神指教小弟, 困扰几天了。

不要说什么Linq等等之类的东东, 我是在SharePoint平台的项目, 都是用DataTable存放数据的!  多分感谢。。。。。   跪求大神了!!

再分析分析你的情况看能不能用 (not) exists  ,你用 累加 <> 或者 in 很容易就溢出了, --------------------编程问答--------------------
引用 楼主 u013069803 的回复:
数据源DataTable  dt, 300条数据。   需要过滤的ID哈希表 - HashTable requestIDs, 其中value是对应的ID。


StringBuilder sb = new StringBuilder();

foreach (DictionaryEntry de in requestIDs)
{
   sb.Append("ID<>" + de.Value.ToString() + " AND ");
}

filterStr = sb.ToString() + "ID<>-1";  //动态生成过滤条件, "ID<>-1"设置一个永远为True来补齐

DataRow[] dtRows = dt.Select(filterStr);  //当filterStr过滤的ID个数超过80个,runtime error - stack overflow exception,  少于80个则正常!



An unhandled exception of type 'System.StackOverflowException' occurred in System.Data.dll

有Google找答案, 但觉得没有合适的,完善的解决方案。 
多数是建议 --- 拆分过滤条件,多次select。

请大神指教小弟, 困扰几天了。

不要说什么Linq等等之类的东东, 我是在SharePoint平台的项目, 都是用DataTable存放数据的!  多分感谢。。。。。   跪求大神了!!

也许你的设计当初就有问题,看看能不能改吧,一下子出来这么多ID要判断,这种想法不容易实现,改设计吧 --------------------编程问答--------------------
引用 楼主 u013069803 的回复:
数据源DataTable  dt, 300条数据。   需要过滤的ID哈希表 - HashTable requestIDs, 其中value是对应的ID。


StringBuilder sb = new StringBuilder();

foreach (DictionaryEntry de in requestIDs)
{
   sb.Append("ID<>" + de.Value.ToString() + " AND ");
}

filterStr = sb.ToString() + "ID<>-1";  //动态生成过滤条件, "ID<>-1"设置一个永远为True来补齐

DataRow[] dtRows = dt.Select(filterStr);  //当filterStr过滤的ID个数超过80个,runtime error - stack overflow exception,  少于80个则正常!



An unhandled exception of type 'System.StackOverflowException' occurred in System.Data.dll

有Google找答案, 但觉得没有合适的,完善的解决方案。 
多数是建议 --- 拆分过滤条件,多次select。

请大神指教小弟, 困扰几天了。

不要说什么Linq等等之类的东东, 我是在SharePoint平台的项目, 都是用DataTable存放数据的!  多分感谢。。。。。   跪求大神了!!

建议你用not in 试一下

StringBuilder sqlCondition=new StringBuilder();
foreach (DictionaryEntry de in requestIDs)
{   
   sqlCondition.Append(de.Value.ToString()+",");
}
if(sqlCondition.Length>0)
{
filterStr=" ID not in ("+sqlCondition.ToString().Substring(0,sqlCondition.Length-1)+") and  ID<>-1";
}
else
{
filterStr="ID<>-1";

DataRow[] dtRows = dt.Select(filterStr);
--------------------编程问答--------------------


引用 6 楼 reenjie 的回复:
Quote: 引用 楼主 u013069803 的回复:

数据源DataTable  dt, 300条数据。   需要过滤的ID哈希表 - HashTable requestIDs, 其中value是对应的ID。


StringBuilder sb = new StringBuilder();

foreach (DictionaryEntry de in requestIDs)
{
   sb.Append("ID<>" + de.Value.ToString() + " AND ");
}

filterStr = sb.ToString() + "ID<>-1";  //动态生成过滤条件, "ID<>-1"设置一个永远为True来补齐

DataRow[] dtRows = dt.Select(filterStr);  //当filterStr过滤的ID个数超过80个,runtime error - stack overflow exception,  少于80个则正常!



An unhandled exception of type 'System.StackOverflowException' occurred in System.Data.dll

有Google找答案, 但觉得没有合适的,完善的解决方案。 
多数是建议 --- 拆分过滤条件,多次select。

请大神指教小弟, 困扰几天了。

不要说什么Linq等等之类的东东, 我是在SharePoint平台的项目, 都是用DataTable存放数据的!  多分感谢。。。。。   跪求大神了!!

建议你用not in 试一下

StringBuilder sqlCondition=new StringBuilder();
foreach (DictionaryEntry de in requestIDs)
{   
   sqlCondition.Append(de.Value.ToString()+",");
}
if(sqlCondition.Length>0)
{
filterStr=" ID not in ("+sqlCondition.ToString().Substring(0,sqlCondition.Length-1)+") and  ID<>-1";
}
else
{
filterStr="ID<>-1";

DataRow[] dtRows = dt.Select(filterStr);



多谢以上各位 wpfLove, guwei4037, lasesiwen, reenjie的回复。   

当时头脑发热没有想到 Not in, 这个应该是会很有帮助的。   谢谢各位, 下星期会公司去试试!!

To lasesiwen, 设计是历史遗留问题, 暂时还大改不了。  多谢。 --------------------编程问答-------------------- 用not in 的时候也要小心一点,数据量少并且量你可以控制的话还是可以用的,但是数据量不固定,一旦特别多同样会溢出。这种情况下能用exists最好
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,