在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
相关文章
同类最新