首页 > 单独文章 > 正文

用MOSS 2007批量更新数据

时间:2008-06-21 22:10:55 作者:officeba 【认证】

在MOSS2007中,有时候需要批量更新数据。通常有2种方式,一种是通过FOREACH语句循环更新列表项完成更新,另一种是通过CAML语言,利用SPWeb对象的ProcessBatchData语句。这里我们就利用第二种方式来做一个更新例子。

首先,创建一个文档库,库名叫做Processed Documents。在文档库中创建两列,Processed 是/否类型字段 和 Processed Date 日期类型字段。
下面我们结合代码分析一下。
---------------------------------------------------------------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint; //引用sharepoint类库
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // 初始化本例中变量
            StringBuilder methodBuilder = new StringBuilder();
            string batch = string.Empty;
            DateTime currentDate = DateTime.Now;    //当前时间,用于process date的更新
            string formattedDate = Microsoft.SharePoint.Utilities.SPUtility.CreateISO8601DateTimeFromSystemDateTime(currentDate);
            string batchFormat = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
            //Batch OnError有两个参数,Return表示出错后返回,另一个参数Continue表示出错后继续执行下面语句,默认为Return
             "<ows:Batch OnError=\"Return\">{0}</ows:Batch>";            
             string methodFormat = "<Method ID=\"{0}\">" + //设置更新列表项
             "<SetList>{1}</SetList>" +                               //设置更新列表GUID
             "<SetVar Name=\"Cmd\">Save</SetVar>" +       //这里利用SetVar对每个参数进行设置,完成执行语句
             "<SetVar Name=\"ID\">{2}</SetVar>" +
          "<SetVar Name=\"urn:schemas-microsoft-com:office:office#Processed\">{3}</SetVar>" +  //设置更新字段,格式为<schema>#<字段名>
             "<SetVar Name=\"urn:schemas-microsoft-com:office:office#Processed_x0020_Date\">{4}</SetVar>" +
             "</Method>";

            using (SPSite site = new SPSite("http://localhost"))     //实例化SPSite
            {
                using (SPWeb web = site.OpenWeb())                   //实例化SPWeb
               {
                  // 取得文档库列表项
                  SPList list = web.Lists["Processed Documents"];
                  string listGuid = list.ID.ToString();

                  // 查询Processed为1的列表项
                  SPQuery query = new SPQuery();
                  query.Query = "<Where><Neq><FieldRef Name='Processed'/><Value Type='Choice'>1</Value></Neq></Where>";
                  query.ViewAttributes = "Scope='Recursive'"; //设置范围为递归,包含子文件夹
                  SPListItemCollection unprocessedItems = list.GetItems(query);

                  // 通过CAML更新
                  for (int i = 0; i < unprocessedItems.Count; i++)
                  {
                     int itemID = unprocessedItems.ID;
                     methodBuilder.AppendFormat(methodFormat, itemID, listGuid, itemID, 1, formattedDate);
                  }
                  batch = string.Format(batchFormat, methodBuilder.ToString());

                  // 利用ProcessBatchData完成批量更新
                  string batchReturn = web.ProcessBatchData(batch);
               }
             }
            }
        }
    }
------------------------------------------------------------------------------------------------------------------------------------

在查询中可能返回大量数据影响性能,可以利用RowLimit来限制每次返回查询条数,例如,每次处理100条记录:
------------------------------------------------------------------------------------------------------------------------------------
query.RowLimit = 100;
do
{
   SPListItemCollection unprocessedItems = list.GetItems(query);
   query.ListItemCollectionPosition = unprocessedItems.ListItemCollectionPosition;
} while (query.ListItemCollectionPosition != null);
-----------------------------------------------------------------------------------------------------------------------------------

另外,可以通过在Processed字段上添加索引提高更新性能。

作者:moss.net


相关文章

同类最新