ReportViewer for WPF/Silverlight
レポートを動的に作成して読み込む
タスク別ヘルプ > C1ReportViewer へのドキュメントの読み込み > レポートを動的に作成して読み込む

動的なレポートの作成もかなり一般的なシナリオです。この場合は、レポートサーバーをアプリケーションサーバーからアクセスできるように構成し、「サーバー内のファイルからドキュメントを読み込む」トピックで説明した Web サービスを使用して、(ファイルから読み込むのではなく)レポートサーバーからレポートストリームを直接取得します。

具体的な手順は、使用しているレポートサーバーによって異なります。たとえば、Microsoft SQL Server Reporting Services サーバーから PDF レポートを動的に取得するには、「サーバー内のファイルからドキュメントを読み込む」トピックに示されている Web サービスを変更します。次に例を示します。

コードのコピー
<ServiceContract([Namespace] := "")> _
<AspNetCompatibilityRequirements(RequirementsMode := AspNetCompatibilityRequirementsMode.Allowed)> _
Public Class ReportsService
      <OperationContract> _
      Public Function GetReportStream(reportName As String) As Byte()
            Dim reportServer As String = "YOUR REPORT SERVER NAME"
            Dim url = String.Format("http://{0}/ReportServer?/{1}&rs:Format=PDF", reportServer, reportName.Replace(" "C, "+"C))
            Dim wc = New System.Net.WebClient()
            wc.UseDefaultCredentials = True
            Dim stream = wc.OpenRead(url)
            Dim ms = New MemoryStream()
            Dim buf = New Byte(64 * 1024 - 1) {}
            While True
                  Dim read As Integer = stream.Read(buf, 0, buf.Length)
                  If read = 0 Then
                        Exit While
                  End If
                  ms.Write(buf, 0, read)
            End While
            ms.Flush()
            Return ms.ToArray()
      End Function
End Class
コードのコピー
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode =
     AspNetCompatibilityRequirementsMode.Allowed)]
public class ReportsService
{
  [OperationContract]
  public byte[] GetReportStream(string reportName)
  {
    string reportServer = "YOUR REPORT SERVER NAME";
    var url = string.Format("http://{0}/ReportServer?/{1}&rs:Format=PDF",
      reportServer,
      reportName.Replace(' ', '+'));
    var wc = new System.Net.WebClient();
    wc.UseDefaultCredentials = true;
    var stream = wc.OpenRead(url);
    var ms = new MemoryStream();
    var buf = new byte[64 * 1024];
    for (; ; )
    {
      int read = stream.Read(buf, 0, buf.Length);
      if (read == 0) break;
      ms.Write(buf, 0, read);
    }
    ms.Flush();
    return ms.ToArray();
  }
}

このように、違いはわずかです。この方法では、レポートサーバーでレポートキャッシュポリシーを指定することもできるため、パフォーマンスやスケーラビリティが損なわれることがありません。

メモ:このトピックの内容は、ComponentOne for Silverlight にのみ適用されます。