4

在我的 asp.net 应用程序中,当运行具有大量参数的报告时,我有一个连接到 ssrs 端点的报告视图(在参数列表中选择所有选项)我收到以下异常被抛出

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

我在这里看到了许多博客以及帖子,其中引用了 MS 应用的安全补丁作为造成此问题的原因,这将您可以在集合中拥有的项目数量限制为 1000。

我还看到了在 web.config 文件中为位于的 wcf 托管服务添加 appSettings 标记C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportServer并添加以下条目的建议

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

我试过这个建议没有运气。运行 sql2008r2 的服务器没有提到任何安全更新,并且将 appSettings 值添加到 web.config(用于 ssrs 管理站点或端点的配置)对异常没有任何影响。如果我有超过 20k 的物品,我什至增加了价值(100000)。

我的第二个想法是 wsHttp 请求上的数据包大小可能太大,我也需要增加它。

更新 在挖掘了更多之后,我发现我在正确的轨道上。以上是根据 MS 条目KB2661403的部分解决方案 MaxCollectionKey 只是条目的一部分。第二部分是参数的序列化,需要将第二个条目添加到 appSettings 部分

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

当我开始考虑这个问题时,我在需要输入的地方也是不正确的。它不需要在 SSRS 端点 web.config 上输入,而是在托管报表查看器控件的站点上输入。将这两个条目添加到 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'))

参数Organization Unit对应的数据集也修改如下,在下拉值中添加值“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 回答