我在从相当大的列表中检索项目时遇到问题。我可以快速轻松地从包含多达或少于50个项目的小列表中检索项目,但是当我尝试从包含多达或少于4600个项目的列表中检索项目时,sqlsever.exe进程会在请求期间出现峰值,但是永远不会检索项目。如果已设置Web应用程序限制设置,那么它不能导致问题。这是我最初用于检索项目的代码。它真的没什么特别的。
using (SPSite site = new SPSite(siteUrl))
{
using (SPWeb web = site.OpenWeb())
{
SPList list = web.Lists[uid.ToString()];
SPListItemCollection itemCollection = list.Items;
foreach (SPListItem i in itemCollection) //This is where the code stops responding
{
//Use list items
}
}
}
之后没有用,我尝试了几种其他方法从列表中检索项目。这是代码:
SPList list = web.Lists[uid.ToString()];
SPQuery query = new SPQuery();
query.Query = "";
query.QueryThrottleMode = SPQueryThrottleOption.Override;
SPListItemCollection itemCollection = list.GetItems(query);
//The code stops here
//I added this part for interest sake, i wanted to if it was the looping that caused the problem
//It seems the when you try to access properties of the item collection that the problem occurs
int itemCount = itemCollection.Count;
foreach (SPListItem i in itemCollection)
{
//Use list items
}
我也尝试过:
SPList list = web.Lists[uid.ToString()];
SPListItemCollectionPosition pos;
DataTable dt = list.GetDataTable(new SPQuery(), SPListGetDataTableOptions.None, out pos); //The code stops responding here
foreach (DataRow i in dt.Rows)
{
//Use data rows
}
有谁知道可能导致此问题的原因?
提前谢谢!
答案 0 :(得分:2)
经过长时间的努力,我们找到了解决方案。
我们发现了这篇文章:
我们测试了它并且它有效!!!
所以我们所要做的就是将“自动创建统计信息”和“自动更新统计信息”切换为true,并解决问题
感谢所有回复
答案 1 :(得分:1)
如果您总是尝试通过list.Items
,list.GetItems(query)
(使用空查询)检索所有项目,则会终止您的服务器。
您需要定义相关查询并指定要通过SPQuery的RowLimit属性检索的结果数量
SPQuery query = new SPQuery();
query.Query = "<OrderBy><FieldRef Name='Title' /></OrderBy>"; // any relevant query here
query.RowLimit = 50;
如果不这样做,则会在执行任何其他操作之前将所有项目加载到内存中。当它尝试加载所有这些数据时,您可能会终止应用程序池可用内存或sql server内存!
希望有所帮助。
答案 2 :(得分:0)
答案 3 :(得分:0)
尝试同时加载所有项目。您可以在SPQuery.ListItemCollectionPosition
(http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spquery.listitemcollectionposition.aspx)的帮助下批量加载(页面方式)。