Определить следующий идентификатор SPListItem в MOSS SPList? - PullRequest
3 голосов
/ 06 августа 2009

Я пытаюсь определить, каким будет идентификатор следующего элемента списка, который будет создан в списке MOSS. Есть ли способ сделать это?

Спасибо, MagicAndi

Ответы [ 4 ]

0 голосов
/ 20 апреля 2010

Я нашел другое решение этой проблемы.

У меня была проблема с версиями:

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();

Можно подумать, что отключение версий приведет к удалению всех версий, кроме текущей, но это не так.

Это не даст вам следующий идентификатор, но может решить основную проблему для кого-то.

0 голосов
/ 02 февраля 2010

Посмотрите на эту ссылку: http://snipplr.com/view/24210/next-splistitem-id-from-splist/, Я пробовал это решение, и оно преодолевает другие недостатки, оно включает запрос к базе данных контента WSS, которая может быть немного дороже, но вы могли бы реализовать гибридное решение где вы бы запросили БД ТОЛЬКО, если colItems.Count == 0 после другой логики.

Привет! * * 1005

0 голосов
/ 02 февраля 2010

Если вы хотите быть более уверенным, что можете создать элемент списка, запишите его идентификатор, удалите элемент списка, и следующий элемент списка будет иметь идентификатор + 1. Это должно преодолеть случай, когда последний элемент был удален.

Конечно, это довольно уродливо ... но так же читает из базы данных контента.

Могу я спросить, зачем тебе это? Кроме того, вы можете добавить в список столбец, содержащий GUID, чтобы вы могли предварительно сгенерировать идентификаторы самостоятельно.

0 голосов
/ 06 августа 2009

Следующий запрос 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.

...