2009-09-11 23 views
5

CrystalReportViewerとCrystalReportSourceを使用してアプリケーションに.rptファイルをロードして表示しています。Crystal Reportの接続を動的に変更する

私が持っている状況はこれです:

は、人は自分のアプリケーションの外にCrystalレポートを作成し、私はその後、私のアプリケーションでその.RPTファイルを使用してデータベースAにそのデータソースを設定すると言うが、私はそれをバインドする必要があります別のデータベース(テーブル構造とカラム名に関しては元のものと同じですが、別のユーザ名とパスワードを使用して異なる接続文字列を使用します)。 C#でどうすればいいですか?

現在、私は使用してレポートをロードします。

this.CrystalReportSource1.ReportDocument.Load(reportsSubfolder + report.ReportFileName); 
//it is here that I need to change the connection data of the report. 

答えて

3

私は、実行時に接続情報を割り当てるには、以下のような関数を使用します。

private void SetDBLogonForReport(CrystalDecisions.Shared.ConnectionInfo connectionInfo, CrystalDecisions.CrystalReports.Engine.ReportDocument reportDocument) 
{ 
    CrystalDecisions.CrystalReports.Engine.Tables tables = reportDocument.Database.Tables; 

    foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables) 
    { 
     CrystalDecisions.Shared.TableLogOnInfo tableLogonInfo = table.LogOnInfo; 

     tableLogonInfo.ConnectionInfo = connectionInfo; 
     table.ApplyLogOnInfo(tableLogonInfo); 
    } 
} 

必要な情報を持つ新しいConnectionInfoオブジェクトを作成して、レポートドキュメントとともに関数に渡すだけで済みます。お役に立てれば。

+0

こんにちはダスティ...助けてくれてありがとう。上記のコード行を実装し、私自身もいくつかの研究を行った。ので、私のコードはhereis:ここ ます。private void AssignConnectionInfo(ReportDocumentをドキュメント、ConnectionInfo crConnection) {foreachの (document.Database.TablesでCrystalDecisions.CrystalReports.Engine.Table crTable) { – suzi167

+1

はコードです - 申し訳ありませんあまりにもポストを直撃早期の前に: ます。private void AssignConnectionの(ReportDocumentをドキュメント、ConnectionInfo crConnection) {foreachの (document.Database.TablesでCrystalDecisions.CrystalReports.Engine.Table crTable) { CrystalDecisions.Shared.TableLogOnInfo tableLogonInfo = crTable.LogOnInfo。 tableLogonInfo.ConnectionInfo = crConnection; crTable.ApplyLogOnInfo(tableLogonInfo); CrystalReportViewer1.ReportSource = document; CrystalReportViewer1.RefreshReport(); } crConnectionには、正しい値が渡されます。 – suzi167

+0

ところでフォーマットはあまり良くありません...タグや何かのようにメッセージをフォーマットする方法はありますか? – suzi167

2

VBコード:

Dim report = New ReportDocument 

    Try 
     'open report 
     report.Load(filename, OpenReportMethod.OpenReportByTempCopy) 

     'do this for each distinct database connection, rather than for table 
     report.SetDatabaseLogon("user", "password", "server", "database") 

    Catch ex As Exception 
     'preserve the stack trace information 
     Throw 

    End Try 
1

あなたは、実行時にレポートの特定の接続の詳細を適用するには、次のコードを使用することができます。

レポートrptファイルのロード直後にこのメソッドを使用し、必要な接続の詳細をメソッドに渡すと、渡された接続の詳細からレポートデータが取得されます。

public static void CrystalReportLogOn(ReportDocument reportParameters, 
              string serverName, 
              string databaseName, 
              string userName, 
              string password) 
    { 
     TableLogOnInfo logOnInfo; 
     ReportDocument subRd; 
     Sections sects; 
     ReportObjects ros; 
     SubreportObject sro; 

     if (reportParameters == null) 
     { 
      throw new ArgumentNullException("reportParameters"); 
     } 

     try 
     { 
      foreach (CrystalDecisions.CrystalReports.Engine.Table t in reportParameters.Database.Tables) 
      { 
       logOnInfo = t.LogOnInfo; 
       logOnInfo.ReportName = reportParameters.Name; 
       logOnInfo.ConnectionInfo.ServerName = serverName; 
       logOnInfo.ConnectionInfo.DatabaseName = databaseName; 
       logOnInfo.ConnectionInfo.UserID = userName; 
       logOnInfo.ConnectionInfo.Password = password; 
       logOnInfo.TableName = t.Name; 
       t.ApplyLogOnInfo(logOnInfo); 
       t.Location = t.Name; 
      } 
     } 
     catch 
     { 
      throw; 
     } 

     sects = reportParameters.ReportDefinition.Sections; 
     foreach (Section sect in sects) 
     { 
      ros = sect.ReportObjects; 
      foreach (ReportObject ro in ros) 
      { 
       if (ro.Kind == ReportObjectKind.SubreportObject) 
       { 
        sro = (SubreportObject)ro; 
        subRd = sro.OpenSubreport(sro.SubreportName); 
        try 
        { 
         foreach (CrystalDecisions.CrystalReports.Engine.Table t in subRd.Database.Tables) 
         { 
          logOnInfo = t.LogOnInfo; 
          logOnInfo.ReportName = reportParameters.Name; 
          logOnInfo.ConnectionInfo.ServerName = serverName; 
          logOnInfo.ConnectionInfo.DatabaseName = databaseName; 
          logOnInfo.ConnectionInfo.UserID = userName; 
          logOnInfo.ConnectionInfo.Password = password; 
          logOnInfo.TableName = t.Name; 
          t.ApplyLogOnInfo(logOnInfo); 
         } 
        } 
        catch 
        { 
         throw; 
        } 
       } 
      } 
     } 
    } 
関連する問題