MOSS リストで作成される次のリスト アイテムの ID を特定しようとしています。これを行う方法はありますか?
ありがとう、マジックアンディ
MOSS リストで作成される次のリスト アイテムの ID を特定しようとしています。これを行う方法はありますか?
ありがとう、マジックアンディ
私はこの問題に対する別の解決策を見つけました。
私が抱えていた問題はバージョンに関連していました:
var newItem = myList.Items.Add();
newItem["Title"] = "whatever";
newItem.Update();
newItem["MyProperty"] = "whatever" + newItem.ID;
newItem.Update();
リストにバージョン管理がありましたが、新しいアイテムの2つの異なるバージョンを作成したくありませんでした。このように解決しました:
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を提供しませんが、誰かの根本的な問題を解決する可能性があります。
このリンクを見てください: http://snipplr.com/view/24210/next-splistitem-id-from-splist/、私はこの解決策を試しましたが、他の欠点を克服しています.WSSコンテンツDBにクエリを実行する必要があります.少し高価になりますが、他のロジックの後に colItems.Count == 0 の場合にのみ DB をクエリするハイブリッド ソリューションを実装できます。
よろしく!
次の 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+1 である必要があるときに N を返します。
リスト項目を作成してその ID を記録し、リスト項目を削除すると、次のリスト項目の ID+1 が確実に得られます。これにより、最後のアイテムが削除された場合が解決されます。
もちろん、これは非常に厄介です..しかし、コンテンツ データベースからの読み取りも同様です。
なぜ必要なのか聞いてもいいですか?または、GUID を含む列をリストに追加して、ID を自分で事前に生成することもできます。