SSRS ReportExecutionServce.LoadReport 卡住了

SSRS ReportExecutionServce.LoadReport gets stuck

考虑以下示例代码:

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 服务器完全没有任何进展。

如果正在加载的报表包含用于填充参数可用值的数据集,并且该数据集基于从 SomeTable.[=12 读取行的查询,则此程序将卡住=]

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

可能的解决方案:

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

我 运行 认为这是一个系统的实际生产问题,该系统 运行 按计划报告,报告 运行 是“计划报告历史记录”报告.

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