IIJIMASが勉強しようとしています。

これからこれから♪

目次

Blog 利用状況

ニュース

共著:




わんくま同盟 東京勉強会 #99 私の資料

個数を数えてみたい!

わんくま同盟 東京勉強会 #91 私の資料

きっと楽しいトポロジー

わんくま同盟 東京勉強会 #45 数学デー 私の資料(pptxとxlsx)

確率の不思議

わんくま同盟 東京勉強会 #37 私のLT資料

数の冪の和の式 を求めてみよう!

デブサミ09でわんくま同盟の紹介をしたスライド

わんくま同盟 東京勉強会 #26 LT祭りの私のスライド

わんくま同盟 東京勉強会 #23の私のスライド

わんくま同盟 東京勉強会 #18の私のスライド


自己紹介(仮)

IIJIMASと申します。
東京都多摩市在住です。多摩川のそばです。
猫好きです。
IIJIMASのSは何って言われます。 IIJIMASって
なんて読むかは自由です。
魚や網間企業とゲームとは無関係です。
数学とか宇宙とかの読み物とか好きです。
血液型:果汁100%A
メタボ予備軍。。。orz
Twitter

...............
MVP 審査応募ページ~ 求む、日本のMVP。
MCTS:.NET Framework 2.0: Windows アプリケーション
MCTS:.NET Framework 2.0: Windows アプリケーション

MCSD.NET:マイクロソフト認定ソリューションデベロッパー(MCSD) Microsoft .NET トラック
Microsoft Certified Solution Developer for Microsoft.NET

リンク

わんくま同盟
わんくま同盟

C#VB.NET掲示板
C#VB.NET掲示板

わんくま同盟 Blog's

ちょっと一言(仮)


書庫

日記カテゴリ

2009年2月27日 #

[SharePoint]リストにアイテムが約2100件以上あると・・・(続き:再現)

[SharePoint]リストにアイテムが約2100件以上あると・・・ の続きです。

「ドキュメント ライブラリ」の同じユーザが閲覧できるアイテムの数が1つのフォルダで約2100件超えている時にWeb画面で

<!-- #RENDER FAILED -->

と表示される件と、Microsoft.SharePoint名前空間のクラスを使用したプログラミングでの

System.Data.SqlClient.SqlException: 着信の表形式のデータ ストリーム (TDS) リモート プロシージャ コール (RPC) プロトコル ストリームが不適切です。この RPC 要求に指定されたパラメータが多すぎます。最大数は 2100 です。

という例外が起こる件についてです。kb958577(機械翻訳kb958577)

確実に再現できるC# コンソールアプリケーションのサンプルプログラムを作成してみました。MOSS2007 SP1(WSS3.0)のサーバーのローカルで実行します。

ファイルを大量にアップロードして、SPListItemCollection.Count プロパティを呼び出すだけです。

まずはSharePointサイトに新規にドキュメントライブラリを作成しておきます。
コンソールアプリケーションを作成して、参照設定でmicrosoft.sharepoint.dllを追加してcsファイル冒頭でusing Microsoft.SharePoint;を書いておきます。次のコードをプログラムの中に記述します。


/// <SUMMARY>
/// 同じファイルをコピーしてドキュメントライブラリに
/// </SUMMARY>
/// <PARAM name="docLib">ドキュメントライブラリ(SPDocumentLibraryオブジェクト)</PARAM>
/// <PARAM name="filePath">コピー元ファイルの絶対パス</PARAM>
/// <PARAM name="loginName">ドキュメント作成者、更新者とするユーザ</PARAM>
/// <PARAM name="start">連番開始番号</PARAM>
/// <PARAM name="end">連番終了番号</PARAM>
private static void UploadManyFiles(SPDocumentLibrary docLib, string filePath, string loginName, int start, int end) { SPWeb web = docLib.ParentWeb; SPFileCollection filecoll = web.Folders[docLib.Title].Files; string fileName = Path.GetFileNameWithoutExtension(filePath); string fileExt = Path.GetExtension(filePath); byte[] fileBytes = ReadAsBytes(filePath); SPUser user = web.EnsureUser(loginName); string url = ""; SPFile file = null; for (int i = start; i <= end; i++) { url = string.Format("{0}/{1}{2:D4}{3}", filecoll.Folder.Url, fileName, i, fileExt); Console.WriteLine("{0} is uploaded by {1}.", url, user.LoginName); file = filecoll.Add(url, fileBytes, user, user, DateTime.Now, DateTime.Now); file.Item.BreakRoleInheritance(false); file.Item.SystemUpdate(); } } /// <SUMMARY>
/// ファイルをバイト列として読み込む
/// </SUMMARY>
/// <PARAM name="filePath">パス</PARAM>
/// <RETURNS>ファイルの中身のバイト列</RETURNS>
private static byte[] ReadAsBytes(string filePath) { MemoryStream ms = new MemoryStream(); byte[] buffer = new byte[1024]; using (BinaryReader br = new BinaryReader(new FileStream(filePath, FileMode.Open))) { while (br.Read(buffer, 0, buffer.Length) > 0) { ms.Write(buffer, 0, buffer.Length); } } byte[] fileBytes = ms.ToArray(); return fileBytes; }

Main()の中で以下の変数の宣言や代入して(省略)下のコードを書きます。

  • docLib:そのSPDocumentLibraryオブジェクト。 SPListからasで取得するなど。
  • filePath:適当なファイルの絶対パス。
  • loginName:に投稿できる権限を持つユーザのログイン名。

・・・
//ドキュメント ライブラリのバージョン設定
//「このドキュメント ライブラリのファイルを編集するたびにバージョンを作成する 」で
//「   メジャーとマイナー (下書き) バージョンを作成する」を選択するのと同様。
docLib.EnableVersioning = true;
docLib.EnableMinorVersions = true;
//            docLib.DraftVersionVisibility = DraftVisibilityType.Reader;//(※1)
docLib.Update();

Console.WriteLine("EnableVersioning = {0}", docLib.EnableVersioning);
Console.WriteLine("EnableMinorVersions = {0}", docLib.EnableMinorVersions);
Console.WriteLine("DraftVersionVisibility = {0}", docLib.DraftVersionVisibility);
UploadManyFiles(docLib,filePath, loginName, 0, 2110);

//「この ドキュメント ライブラリ の下書きアイテムを表示できるユーザー」を 「アイテムを編集できるユーザー」にするのと同じ
docLib.DraftVersionVisibility = DraftVisibilityType.Author;//(※2)
docLib.Update();//(※2)
Console.WriteLine("DraftVersionVisibility = {0}", docLib.DraftVersionVisibility);
Console.WriteLine("list.Items.Count = {0}", docLib.Items.Count);//←ここで上記の例外が発生します!!!

ちなみに、(※1)の行をコメント解除して、(※2)の行をコメント化すると例外は発生しません。

Webでの設定画面でも「ドキュメント ライブラリ」>「バージョン設定」 >「下書きアイテムのセキュリティ」>「この ドキュメント ライブラリ の下書きアイテムを表示できるユーザー」 のラジオボタンの選択によって、以下のように起きない場合もあります。

アイテムを閲覧できるすべてのユーザー この例外が発生しない。
アイテムを編集できるユーザー この例外が発生する。
アイテムの作成者およびアイテムを承認できるユーザー
「コンテンツの承認を必須にする」が「はい」のとき
この例外が発生する。

posted @ 0:59 | Feedback (75)