首页 > 解决方案 > SSRS ReportExecutionServce.LoadReport 卡住

问题描述

考虑以下示例代码:

using System.Data.SqlClient;

namespace ReportLoadTest
{
  class Program
  {
    static void Main(string[] args)
    {
      using (var con = new SqlConnection("...your connection string here..."))
      {
        con.Open();
        var trans = con.BeginTransaction();
        var cmd = con.CreateCommand();
        cmd.Transaction = trans;
        cmd.CommandText = @"insert SomeTable(...columns...) values (...); select scope_identity()";
        var rows = cmd.ExecuteScalar();

        var rs = new SSRS.ReportExecutionService();
        rs.Credentials = System.Net.CredentialCache.DefaultCredentials;
        rs.Url = "http://localhost/ReportServer/ReportExecution2005.asmx";

        var ei = rs.LoadReport("/Folder/Folder/Some report", null);
      }
    }
  }
}

在什么情况下这个程序会在调用时“卡住” ReportExecutionService.LoadReport

卡住是指 0 CPU、0 I/O - 调用程序、Reporting Services 或 SQL Server 根本没有任何进展。

标签: c#reporting-servicesssrs-2016ssrs-2014

解决方案


如果正在加载的报表包含用于填充参数可用值的数据集,并且该数据集基于从SomeTable.

LoadReport 最终会超时,并且会留下零有用的信息来帮助您弄清楚发生了什么。

可能的解决方案:

  • 更改报告以执行“脏读”SomeTable
  • 将数据库更改为快照隔离模式以避免锁定表。

我遇到了一个实际的生产问题,系统按计划运行报告,并且正在运行的报告是“计划报告历史”报告。

微妙之处在于 LoadReport 运行查询 - 回想起来,很明显它必须运行查询,因为参数的可用值包含在 LoadReport 返回的 ExecutionInfo 中。


推荐阅读