4

asp.net アプリケーション内に、多数のパラメーター (パラメーター リストですべてのオプションを選択) を使用してレポートを実行するときに、ssrs エンドポイントに接続する reportview があります。次の例外がスローされます。

Operation is not valid due to the current state of the object.

コレクションに含めることができるアイテムの数を 1000 に制限する原因として、MS によって適用されたセキュリティ パッチを参照している多くのブログや投稿をここで見てきました。

C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportServerまた、次の場所にある wcf ホスティング サービスの web.config ファイル内に appSettings タグを追加し、次のエントリを追加するという提案も見ました。

<appSettings>
    <add key="aspnet:MaxHttpCollectionKeys" value="20000" />
  </appSettings>

私はこの提案を試してみましたが、うまくいきませんでした。sql2008r2 を実行しているサーバーには、前述のセキュリティ更新プログラムのいずれも適用されておらず、appSettings 値を web.config (ssrs 管理サイトまたはエンドポイントの構成) に追加しても、例外に影響はありません。20,000 個を超えるアイテムがある場合は、値 (100000) を増やしました。

私の 2 番目の考えは、wsHttp 要求のパケット サイズが大きすぎる可能性があり、それも大きくする必要があるということでした。

更新 さらに掘り下げた後、私は正しい軌道に乗っていることがわかりました。上記は、MS エントリKB2661403による部分的な解決策でした。MaxCollectionKey はエントリの一部に過ぎませんでした。2 番目の部分は、2 番目のエントリを appSettings セクションに追加する必要があるパラメーターのシリアル化です。

<add key="aspnet:MaxJsonDeserializerMembers" value="1000" />

これについて考え始めたとき、これを入力する必要がある場所も間違っていました。SSRS エンドポイントの web.config で入力する必要はありませんでしたが、レポート ビューアー コントロールをホストするサイトで入力する必要がありました。これら 2 つのエントリを web.config に追加すると、オブジェクトが正常に渡されます。現在、SSRS システムは ASP.NETSessionTimeOut 例外を返しているため、このタイムアウトを延長して、大規模なクエリでデータを取得できるかどうかを確認する必要があります。

提案や推奨事項はありますか?

-乾杯

4

1 に答える 1

2

常にレポートを再設計できるわけではありません。顧客が望むときに顧客が望むのです。

とはいえ、カスケード パラメーター用の大規模なデータセットを含むレポートの数が増えているため、このエラーがかなり発生していました。ドロップダウンに 1500 を超える値を持つ複数のパラメーターを含むレポートがいくつかありました。上記の解決策は、一部では機能しましたが、他のソリューションでは機能しませんでした。同僚 (Pranay Papishetty) が素晴らしい修正を思いついたときです (一般的な説明に置き換えるのではなく、すべてのフィールド名をそのままにしておきます。それでも要点を理解できるはずです)。

POS_08 のサブスクリプションの問題を修正:

レポート POS_08 には、1500 に近いドロップ ダウン値を持つ組織単位: というラベルのパラメーターがあります。このレポートには、レポートの購読を設定する際の問題として作成された、各パラメーターのドロップ ダウン値の数が多い他のパラメーターもいくつかあります。パラメータ ドロップダウン値が大量にあるため、レポート サーバーにアーキテクチャ上の変更を加えた後でも、問題は解決されませんでした。

データセットで一種のパラメータ マスキングを考え出しました。通常、組織単位をメイン データセット クエリに渡すには、メイン クエリの where 句で次のフィルタを使用します。

dbo.vw_orgunit.orgunit in @orgunit

(@OrgUnit は、組織単位をクエリに渡すパラメーターです。)

組織単位に上記のフィルターを使用する代わりに、以下のように変更したフィルターを使用しました。

((dbo.vw_orgunit.Orgunit IN ((SELECT item
FROM   [DW_Master].[dbo].fn_Split (@orgunit_d, ','))))
OR (@orgunit_d) IN ('All Org Units'))

パラメータ組織単位に対応するデータセットも次のように変更され、値「すべての組織単位」がドロップダウン値に追加されます。

    SELECT DISTINCT 
       [OrgUnit] AS [OrgUnit_Code], 
       [OrgUnitDescription] AS [OrgUnit_Desc], 
       ([OrgUnit] + ' - ' + [OrgUnitDescription]) AS [OrgUnit_Label]
FROM dbo.vw_DimOrgUnit
WHERE (
        [OrgLevelAgency] = '73' 
        AND [OrgLevelFiscalYear] IN ( @FiscalYear )
        AND ([OrgLevel_1] + ' - ' + [OrgLevel_1_Description]) IN ( @OrgLevel_1_Label )
        AND ([OrgLevel_2] + ' - ' + [OrgLevel_2_Description]) IN ( @OrgLevel_2_Label )
        AND ([OrgLevel_3] + ' - ' + [OrgLevel_3_Description]) IN ( @OrgLevel_3_Label )
      ) OR [OrgUnitSKey] = '-1' OR ( [OrgUnit] = '5117' AND [OrgUnitFiscalYear] = '2013' /* A Special Case*/ )

UNION
SELECT '' , '', '(Blank)'
UNION
SELECT 'none' , 'none', 'None'
UNION 
SELECT '-100','All Org Units','All Org Units'
ORDER BY [OrgUnit]
;

このように、ユーザーがすべての組織単位を選択したい場合、ドロップダウン値全体を選択してクエリに渡すのではなく、「すべての組織単位」を選択するだけで済みます。これにより、レポートの実行時間が短縮され、クエリのパフォーマンスが向上します。すべての変更が実装された後、サブスクリプションも正常にセットアップされました。

于 2014-10-18T22:07:49.003 に答える