3

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

谢谢,魔术安迪

4

4 回答 4

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。

于 2009-08-06T15:38:01.523 回答
0

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

问候!

于 2010-02-01T23:34:04.587 回答
0

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

当然,这是非常普遍的......但从内容数据库中读取也是如此。

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

于 2010-02-02T00:40:11.817 回答
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,但可能会解决某人的潜在问题。

于 2010-04-20T13:48:32.927 回答