SharePoint の非同期イベント(ItemAdded、ItemUpdated、など)におけるアイテム更新時の注意点


環境:
Office SharePoint Server 2007 

こんにちは。

デバッグをしている中でこのような事例がありましたので、ご参考のため記載しておきます。(私が書いたソースではないのですが、もしかして同じようなコードが多いのではないかと思い、、、)

SharePoint におけるイベントレシーバ (SPItemEventReceiver) の中で、SPListItem (ドキュメントライブラリやリストなどのアイテム) の更新をおこなうというのは頻繁(というか一般的)におこなわれると思います。
この際、そのイベントを発生しているアイテムと同一のアイテムの属性などを更新したい場合には、以下の点に注意してください。

ItemAfdded、ItemUpdated など "ed" と付くイベント処理は、イベント発生後に呼ばれる処理ですが、ItemAdding や ItemUpdating など処理前に呼ばれるものと異なり非同期で呼び出されます。
このため、Word や Excel の文書アイテムでこの処理を記述すると、ItemAfdded や ItemUpdated が呼ばれている際に、まだ編集中の状態でアイテムにロックがかかっているという状況がタイミングによって発生します。このタイミングの場合、SPListItem の Update メソッドを呼び出しても、ロックが原因で例外(もしくはエラー)が発生します。(しかも、イベントレシーバーなので、エラーはユーザの画面には表示されず、内部でプログラムの処理が停止します。)

こうした場合には、Update() メソッドではなく、SystemUpdate() メソッドを使って更新をおこなってください。
SystemUpdate は、ロックに関係なくアイテムを更新します。(ただし、更新日付なども変更されません。つまり、他のドキュメントライブラリにドキュメントをアップする場合などは、いつも通り Update() メソッドを使うべきです。)

同じ内容ではまる方も居られるかもしれないので、念のため記載しておきました。

(「Orcas における VSTO の新機能」は、またお時間あるときにアップします、、、)

 

Comments (0)

Skip to main content