确定MOSS SPList中的Next SPListItem ID?

时间:2009-08-06 15:35:05

标签: sharepoint sharepoint-2007 moss caml

我正在尝试确定要在MOSS列表中创建的下一个列表项的ID是什么。有没有办法做到这一点?

谢谢,MagicAndi

4 个答案:

答案 0 :(得分:0)

以下CAML查询将确定下一个要生成的最可能的ID:

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;

但是,这对于最近生成的列表项(ID为N)被删除的情况不起作用,然后我们使用上面的代码给出下一个ID - 它将返回N,当它应该是N时1。

答案 1 :(得分:0)

看看这个链接:http://snipplr.com/view/24210/next-splistitem-id-from-splist/,我已经尝试过这个解决方案,它确实克服了其他缺点,它涉及查询WSS内容数据库,这可能会有点贵,但你可以实现一个混合解决方案,如果colItems.Count在另一个逻辑之后== 0,你将只查询DB。

问候!

答案 2 :(得分:0)

如果你想更加确定你可以创建一个listitem,记录它的ID,删除列表项,下一个listitem将有ID + 1。这应该克服最后一项被删除的情况。

当然这很好..但是从内容数据库中读取也是如此。

我可以问你为什么需要它吗?或者,您可以在列表中添加一个包含GUID的列,以便您自己预先生成ID。

答案 3 :(得分:0)

我找到了解决这个问题的另一种方法。

我遇到的问题与版本有关:

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

有人可能会认为关闭版本会删除除当前版本之外的所有版本,但事实并非如此。

这不会为您提供下一个ID,但可能会解决某人的潜在问题。