如何获取大型sharepoint列表项(> 10000)并将其写入文本文件

时间:2014-11-04 08:07:50

标签: sharepoint sharepoint-2010 sharepoint-2007 sharepoint-2013

我的SharePoint网站包含一个包含大数据的大型列表 我必须获取所有项目并在gridview中显示它们? 我使用下面的代码并得到以下错误

“禁止尝试的操作,因为它超出了管理员强制执行的列表视图阈值”

private void GetData()
    {
        using (SPSite site = new SPSite("URL"))
        {
            using (SPWeb web = site.OpenWeb())
            {
                SPList list = web.Lists.TryGetList("BulkData");

                if (list != null)
                {
                    SPQuery query = new SPQuery();
                    query.Query = "<Where><IsNotNull><FieldRef Name=\"Title\" /></IsNotNull></Where>";
                    query.QueryThrottleMode = SPQueryThrottleOption.Override;
                    SPListItemCollection items = list.GetItems(query);
                    int itemCount = items.Count;
                    StringBuilder sb = new StringBuilder();
                    string str1 = string.Empty;
                    foreach (SPListItem item in items)
                    {
                        int i = 1;
                        sb.Append("\r\n").Append(Convert.ToString(item["Title"])).Append("\r\n");
                        i++;
                    }
                    Log(sb);
                }
            }
        }
    }

区域日志文件

    public void Log(StringBuilder ErrorMessage)
    {

        string LogFileTime = DateTime.Now.ToString("ddMMyyyyHHmmss");
        string LogFilePath = Server.MapPath(@"~\\Logs\");
        if (!File.Exists(LogFilePath + "BulkData" + LogFileTime + ".txt"))
        {
            var LogFileName = File.Create(LogFilePath + "BulkData" + LogFileTime + ".txt");
            var WriteToLogFile = new StreamWriter(LogFileName);
            WriteToLogFile.Write(ErrorMessage);
            WriteToLogFile.Close();
            LogFileName.Close();
        }


    }
    #endregion

3 个答案:

答案 0 :(得分:1)

您必须修改Central Admin中的列表视图阈值,默认设置为5000个元素。

为了最大限度地减少数据库争用,SQL Server通常使用行级锁定作为策略来确保准确更新,而不会对访问其他行的其他用户产生负面影响。

但是,如果读取或写入数据库操作(例如查询)导致一次锁定超过5,000行,则SQL Server临时将锁定升级到整个表的效率会更高,直到数据库操作为止完成。

enter image description here

MSDN

上查看此链接

请参阅此instructions step-by-step

的链接

但是,如果您必须通过代码更改此值,则可以

SPQuery q1 = new SPQuery();
q1.QueryThrottleMode = SPQueryThrottleOption.Override;

小心!请记住为将运行代码的帐户授予权限。

有关详细信息,请参阅this link

答案 1 :(得分:0)

尝试使用SPQuery.RowLimit指定要提取的项目数。 (MSDN链接还有一个在多个页面中加载有限数量项目的示例)

答案 2 :(得分:0)

您可以使用两种不同的方法:

  1. ContentIterator对象 - 在SharePoint中不可用 基础
  2. SPWeb.ProcessBatchData使用Display方法 - 可在SP Foundation中找到,但由于它非常复杂,因此非常复杂。