超时从列表中检索项目

时间:2011-01-26 06:39:18

标签: sql sql-server sharepoint sharepoint-2010 sql-server-2008-r2

我在从相当大的列表中检索项目时遇到问题。我可以快速轻松地从包含多达或少于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 
}

有谁知道可能导致此问题的原因?

提前谢谢!

4 个答案:

答案 0 :(得分:2)

经过长时间的努力,我们找到了解决方案。

我们发现了这篇文章:

http://trycatch.be/blogs/tom/archive/2009/04/22/never-turn-off-quot-auto-create-amp-auto-update-statistics-quot.aspx

我们测试了它并且它有效!!!

所以我们所要做的就是将“自动创建统计信息”和“自动更新统计信息”切换为true,并解决问题

感谢所有回复

答案 1 :(得分:1)

如果您总是尝试通过list.Itemslist.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)

尝试使用CAML查询获取数据。

获得数据后,您可以将其放入SPQuery

答案 3 :(得分:0)

尝试同时加载所有项目。您可以在SPQuery.ListItemCollectionPositionhttp://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spquery.listitemcollectionposition.aspx)的帮助下批量加载(页面方式)。