用好ProcessBatchData (1)概述
通常,我们在SharePoint中创建、更新,删除Item,文档或者文件夹时,都有对应的方法,比如创建一个Item:
SPListItem item = list.Items.Add(web.Url + "/" + list.RootFolder.Url,SPFileSystemObjectType.File,"myitem001");
item["Title"] = "item001";
item.Update();
创建一个folder:
SPListItem item = list.Items.Add(web.Url + "/" + list.RootFolder.Url,SPFileSystemObjectType.Folder,"myfolder001");
item.Update();
创建一个从folder继承来的Content Type:
SPListItem item = list.Items.Add(web.Url + "/" + list.RootFolder.Url,SPFileSystemObjectType.Folder,"myfolderContentType001");
item["ContentTypeId"] = myCType.Id;
item.Update();
但是当需要做大量的操作时,如果用上面的方法,效率就会比较低,比如Update,实际上SharePoint是调用了一个存储过程,这样会造成频繁的向服务器发起请求,严重增加了服务器的负担,最好的方法就是使用批量操作的方法:ProcessBatchData,当然也可以使用web services,不过web services的方法不在本文的讨论范围内。
msdn上有对该方法的描述(http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spweb.processbatchdata.aspx),但是总觉得不是很详细,而且实例太少,本文结合自己在实际使用中遇到的问题,尽量详细的对该方法做具体的说明,使我们能够用好ProcessBatchData方法。
ProcessBatchData方法本身很简单:
string strReturnValue = web.ProcessBatchData(strBatchOperation)
主要在构建strBatchOperation上,刚刚开始使用该方法的人,往往觉得不好使用,因为某个参数或者值不对,就会导致该方法失败,但是如果用好了,其实该方法会使批量操作的性能大大提高。
strBatchOperation的格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<ows:Batch OnError="Continue">
<Method ID='0'>
<SetVar Name="Cmd">Save</SetVar>
<SetVar Name="ID">New</SetVar>
<SetList>af653a38-7a6a-455c-a295-1604c4104a61</SetList>
<SetVar Name="urn:schemas-microsoft-com:office:office#ContentType">Item子类型</SetVar>
<SetVar Name="urn:schemas-microsoft-com:office:office#Title">Item001</SetVar>
<SetVar Name="owsfileref">/ProjectCenter/ATP/Lists/Schedules/folderLevel1/Item001</SetVar>
</Method>
</ows:Batch>
其中:
OnError: 表示遇到错误是继续还是跳出,有两个选项:
Return:默认值,表示遇到错误即返回;
Continue:表示遇到错误后,记录错误然后继续。
Method:一个Method表示一个操作,必备的参数是方法的ID,每个要不同
SetVar: 设置栏位(Field)值,用来更新栏位值或者使用该栏位值搜索到对象
Cmd:表示操作类型,有三种:Save,Delete和Moderate
Save:根据ID值是New还是ID值,来确定是否新建还是更新
Delete: 删除
Moderate:设置审批状态,同时也可以用来设置属性值,和Save的区别后面再描述
ID:如果是新建,就为New,如果是更新,就填写待更新的对象的ID值,注意不是GUID
以“urn:schemas-microsoft-com:office:office#”开头的变量,表示自定义Field、ContentType或Title,需要注意的是,此处需要填写Field的内部值
SetList:列表GUID值,表示在该列表下操作。