Определить идентификатор Next SPListItem в MOSS SPList?

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

Спасибо, MagicAndi


person MagicAndi    schedule 06.08.2009    source источник
comment
Это вопрос, который должен заставить вас переосмыслить свой подход. Зачем нужно знать будущее? Для чего вам нужно это значение?   -  person Greg Hurlman    schedule 06.08.2009


Ответы (4)


Следующий 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.

person MagicAndi    schedule 06.08.2009
comment
Да, это также не работает, если вы удалите все свои элементы в списке, код вернет 1, хотя внутренне все еще ведет счет - person murki; 30.01.2010

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

С Уважением!

person murki    schedule 01.02.2010

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

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

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

person ArjanP    schedule 02.02.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();

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

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

person michelin    schedule 20.04.2010
comment
Вместо того, чтобы отключать и включать управление версиями, лучшим решением является вызов newItem.SystemUpdate(false) для обновления элемента без запуска новой версии. Надеюсь это поможет! - person Brandon Johnson; 01.03.2017