我正在尝试确定要在 MOSS 列表中创建的下一个列表项的 ID 是什么。有没有办法做到这一点?
谢谢,魔术安迪
以下 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。
看看这个链接:http ://snipplr.com/view/24210/next-splistitem-id-from-splist/ ,我已经尝试过这个解决方案,它确实克服了其他缺点,它涉及查询 WSS 内容数据库,它可以会贵一点,但您可以实施混合解决方案,仅当 colItems.Count == 0 在其他逻辑之后查询数据库。
问候!
如果你想更确定你可以创建一个列表项,记录它的 ID,删除列表项,下一个列表项的 ID+1。这应该可以克服最后一个项目被删除的情况。
当然,这是非常普遍的......但从内容数据库中读取也是如此。
我可以问你为什么需要它吗?或者,您可以在列表中添加一个包含 GUID 的列,以便您自己预先生成 ID。
我找到了解决这个问题的另一种方法。
我遇到的问题与版本有关:
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,但可能会解决某人的潜在问题。