Я пытаюсь определить, каким будет идентификатор следующего элемента списка, который будет создан в списке MOSS. Есть ли способ сделать это?
Спасибо, MagicAndi
Я пытаюсь определить, каким будет идентификатор следующего элемента списка, который будет создан в списке MOSS. Есть ли способ сделать это?
Спасибо, MagicAndi
Следующий CAML-запрос определит наиболее вероятный идентификатор, который будет сгенерирован следующим:
int iNextID = 1;
try
{
using (SPSite objSite = new SPSite(sSiteUrl))
{
using (SPWeb objWeb = objSite.OpenWeb())
{
SPList objList = objWeb.Lists[sListName];
SPQuery objQuery = new SPQuery();
// objQuery.RowlImit = 1;
objQuery.Query = "<OrderBy><FieldRef Name='ID' Ascending='False' /></OrderBy><RowLimit>1</RowLimit>";
objQuery.Folder = objList.RootFolder;
// Execute the query against the list
SPListItemCollection colItems = objList.GetItems(objQuery);
if (colItems.Count > 0)
{
string sMaxID = colItems[0]["ID"].ToString();
iNextID += int.Parse(sMaxID);
}
}
}
}
catch (Exception ex)
{
...
}
return iNextID;
Однако это не работает в случае, когда самый последний сгенерированный элемент списка (с идентификатором N) удаляется, а затем мы используем приведенный выше код для присвоения следующего идентификатора — он вернет N, хотя должен быть N+1.
Посмотрите на эту ссылку: http://snipplr.com/view/24210/next-splistitem-id-from-splist/, я попробовал это решение, и оно преодолевает другие недостатки, оно включает запрос к базе данных содержимого WSS, что может быть немного дороже, но вы можете реализовать гибридное решение, в котором вы будете запрашивать БД ТОЛЬКО, если colItems.Count == 0 после другой логики.
С Уважением!
Если вы хотите быть более уверенным, вы можете создать элемент списка, записать его идентификатор, удалить элемент списка, и следующий элемент списка будет иметь идентификатор +1. Это должно преодолеть случай, когда последний элемент был удален.
Конечно, это довольно некрасиво... но то же самое можно сказать и о чтении из базы данных контента.
Могу я спросить, зачем вам это нужно? В качестве альтернативы вы можете добавить в свой список столбец, содержащий GUID, чтобы вы могли предварительно сгенерировать идентификатор самостоятельно.
Я нашел другое решение этой проблемы.
Проблема, с которой я столкнулся, была связана с версиями:
var newItem = myList.Items.Add();
newItem["Title"] = "whatever";
newItem.Update();
newItem["MyProperty"] = "whatever" + newItem.ID;
newItem.Update();
В моем списке было управление версиями, но я не хотел создавать две разные версии моего нового элемента. Решил так:
var newItem = myList.Items.Add();
newItem["Title"] = "whatever";
newItem.Update();
myList.EnableVersioning = false;
myList.Update();
newItem["MyProperty"] = "whatever" + newItem.ID;
newItem.Update();
myList.EnableVersioning = true;
myList.Update();
Можно подумать, что отключение управления версиями удалит все версии, кроме текущей, но это не так.
Это не дает вам следующий идентификатор, но может решить основную проблему для кого-то.