Объектная модель SharePoint предоставляет множество функциональных возможностей, что позволяет выполнить одну и ту же операцию разными способами. У каждого из способов есть свои преимущества: один проще использовать, другой имеет более высокую производительность. Одной из таких операций является операция пакетной вставки (редактирования, удаления) данных в списках и библиотеках документов SharePoint.
Самым элементарным способом добавления данных в списки является использование методов класса SPListItemCollection. Данный способ удобен, в случае если необходимо добавить одну или несколько записей. Если необходимо обработать большой массив данных с оптимальной производительностью рекомендуется использовать метод ProcessBatchData класса SPWeb.
Данный метод позволяет выполнить за один вызов сразу пакет команд. Для этого, ему в качестве параметра передается CAML запрос, который содержит необходимые операции.
Приведенный ниже пример использует метод ProcessBatchData класса SPWeb для добавления в список 100 записей:
Основным элементом CAML запроса является элемент <Method>. Содержимое данного элемента описывает саму логику операции. В частности с помощью элемента <SetList> указывается, для какого списка будет выполняться операция.
Элемент <SetVar> используется для задания параметров команды. Так, с помощью него устанавливается тип выполняемой команды и значения полей. При этом при установке значений полей, название полей необходимо начинать с префикса urn:schemas-microsoft-com:office:office# (за некоторым исключением). В случае вставки данных для поля ID необходимо указать значение New, что указывает SharePoint сгенерировать ID элемента автоматически.
Насколько быстрее?
Согласно измерениям Андреаса Грабнера и Эрика Бартелса использование метода ProcessBatchData дает почти двукратное преимущество в скорости выполнения. Причем такое превосходство заметно как на большом количестве записей (более 200 000 записей), так и на относительно небольших объемах данных – 100 записей.
Однако при использовании ProcessBatchData стоит не забывать использовать StringBuilder для генерации CAML команд.
Примеры использования
Ниже приведены примеры пакетных CAML запросов для работы с записями в списках и библиотеках документов SharePoint:
Структура CAML
RPC методы WSS
Самым элементарным способом добавления данных в списки является использование методов класса SPListItemCollection. Данный способ удобен, в случае если необходимо добавить одну или несколько записей. Если необходимо обработать большой массив данных с оптимальной производительностью рекомендуется использовать метод ProcessBatchData класса SPWeb.
Данный метод позволяет выполнить за один вызов сразу пакет команд. Для этого, ему в качестве параметра передается CAML запрос, который содержит необходимые операции.
Приведенный ниже пример использует метод ProcessBatchData класса SPWeb для добавления в список 100 записей:
string listId = "C3715A5A-879B-4573-AED4-35E9DCD4E5F7";
string batchCommandFormat = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><ows:Batch OnError=\"Continue\">{0}</ows:Batch>";
string batchMethodFormat = "<Method ID=\"SaveItem_{0}\">" +
"<SetList Scope=\"Request\">{1}</SetList>" +
"<SetVar Name=\"Cmd\">Save</SetVar>" +
"<SetVar Name=\"ID\">New</SetVar>" +
"<SetVar Name=\"urn:schemas-microsoft-com:office:office#Title\">{2}</SetVar>" +
"</Method>";
StringBuilder methodsBuilder = new StringBuilder();
for (int i = 0; i < 20; i++)
{
methodsBuilder.AppendFormat(batchMethodFormat, i, listId, "Item title " + i);
}
string batchResult = web.ProcessBatchData(String.Format(batchCommandFormat, methodsBuilder));
* This source code was highlighted with Source Code Highlighter.
Основным элементом CAML запроса является элемент <Method>. Содержимое данного элемента описывает саму логику операции. В частности с помощью элемента <SetList> указывается, для какого списка будет выполняться операция.
Элемент <SetVar> используется для задания параметров команды. Так, с помощью него устанавливается тип выполняемой команды и значения полей. При этом при установке значений полей, название полей необходимо начинать с префикса urn:schemas-microsoft-com:office:office# (за некоторым исключением). В случае вставки данных для поля ID необходимо указать значение New, что указывает SharePoint сгенерировать ID элемента автоматически.
Насколько быстрее?
Согласно измерениям Андреаса Грабнера и Эрика Бартелса использование метода ProcessBatchData дает почти двукратное преимущество в скорости выполнения. Причем такое превосходство заметно как на большом количестве записей (более 200 000 записей), так и на относительно небольших объемах данных – 100 записей.
Однако при использовании ProcessBatchData стоит не забывать использовать StringBuilder для генерации CAML команд.
Примеры использования
Ниже приведены примеры пакетных CAML запросов для работы с записями в списках и библиотеках документов SharePoint:
- Добавление записи в список
<Method ID="CreateItem">
<SetList Scope="Request">C3715A5A-879B-4573-AED4-35E9DCD4E5F7</SetList>
<SetVar Name="Cmd">Save</SetVar>
<SetVar Name="ID">New</SetVar>
<SetVar Name="urn:schemas-microsoft-com:office:office#Title">New item title</SetVar>
</Method>
- Создание новой папки
<Method ID="CreateFolder">
<SetList Scope="Request">C3715A5A-879B-4573-AED4-35E9DCD4E5F7</SetList>
<SetVar Name="Cmd">Save</SetVar>
<SetVar Name="ID">New</SetVar>
<SetVar Name="Type">1</SetVar>
<SetVar Name="urn:schemas-microsoft-com:office:office#Title">New folder title</SetVar>
<SetVar Name="owsfileref">/lists/test/folder 1</SetVar>
</Method>
- Удаление записи (записи или папки)
<Method ID="DeleteItem">
<SetList Scope="Request">C3715A5A-879B-4573-AED4-35E9DCD4E5F7</SetList>
<SetVar Name="Cmd">Delete</SetVar>
<SetVar Name="ID">50016</SetVar>
</Method>
Для удаления файла в библиотеке документов необходимо дополнительно указать относительный путь к файлу в параметре owsfileref:
<SetVar Name="owsfileref">doclib/file.xls</SetVar>
- Изменение полей записи
<Method ID="UpdateItem">
<SetList Scope="Request">C3715A5A-879B-4573-AED4-35E9DCD4E5F7</SetList>
<SetVar Name="Cmd">Save</SetVar>
<SetVar Name="ID">50023</SetVar>
<SetVar Name="urn:schemas-microsoft-com:office:office#Title">Updated title</SetVar>
</Method>
- Переименование файла или папки
<Method ID="RenameItem">
<SetList Scope="Request">0e8bdba7-4486-4fa0-9a44-f80cd31f538a</SetList>
<SetVar Name="Cmd">Save</SetVar>
<SetVar Name="ID">6</SetVar>
<SetVar Name="owsfileref">/doclib/file.xls</SetVar>
<SetVar Name="owsnewfileref">file_new</SetVar>
</Method>
В параметре owsnewfileref расширение и путь к файлу указывать при этом не надо. Такой же CAML используется для переименования папок – в этом случае в параметре owsfileref указывается относительный путь к папке, которую необходимо переименовать, а в параметре owsnewfileref новое название папки.
Структура CAML
RPC методы WSS