Я пытаюсь определить, каким будет идентификатор следующего элемента списка, который будет создан в списке MOSS. Есть ли способ сделать это?Определить следующий идентификатор SPListItem в SPList MOSS?
Спасибо, MagicAndi
Я пытаюсь определить, каким будет идентификатор следующего элемента списка, который будет создан в списке MOSS. Есть ли способ сделать это?Определить следующий идентификатор SPListItem в SPList 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.
Да, это также не сработает, если вы удалите все свои элементы в списке, код вернет 1, хотя внутренне все еще держит счет – murki
Посмотрите на эту ссылку: http://snipplr.com/view/24210/next-splistitem-id-from-splist/, я пробовал это решение, и он преодолевает другие недостатки, он включает в себя запрос БД контента, который может быть немного дороже, но вы можете реализовать гибридное решение, в котором вы будет запрашивать БД ТОЛЬКО, если colItems.Count == 0 после другой логики.
С уважением!
Если вы хотите быть более уверенным, вы можете создать список, записать его идентификатор, удалить элемент списка, а следующий список будет иметь идентификатор + 1. Это должно привести к тому, что последний элемент был удален.
Конечно, это довольно uqly .. но так же читается из базы данных контента.
Могу ли я спросить, зачем вам это нужно? Кроме того, вы можете добавить столбец в свой список, содержащий 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();
Можно было бы подумать, что включение версий от сотрет все версии, кроме тока, но это не так.
Это не дает вам следующий идентификатор, но может решить основную проблему для кого-то.
Вместо того, чтобы выключать и управлять версиями, лучшим решением является вызов newItem.SystemUpdate (false) для обновления элемента без запуска новой версии. Надеюсь это поможет! –
Это вопрос, который должен заставить вас переосмыслить ваш подход. Зачем вам нужно знать будущее? Для чего вам нужно это значение? –