2012-01-15 20 views
2

ローカルマシンでCrystalレポートを作成しました.ExportToHttpResponseを使用してローカルWebサイトでレポートをレンダリングできますが、コードを運用サーバーに移動するとすぐに「データベースログオン失敗しました "エラー。私は基本的に.XMLデータセットファイルをソースとして使用して、レポートをローカルに開発しました。これは私のコードだった:Web Crystalレポートの生成データベースのログオンに失敗しました

private void RenderCrystalReports(string rptName, string pdfReportName, DataSet dataForReport) 
    { 
    string reportPath = Server.MapPath(@"\App_Data\Reports\" + rptName); 
    ReportDocument report = new ReportDocument(); 
    report.Load(reportPath, OpenReportMethod.OpenReportByTempCopy); 
    SetDBLogonForReport(ref report); 
    report.SetDataSource(dataForReport); 
    SetDBLogonForReport(ref report); 
    report.ExportToHttpResponse(ExportFormatType.PortableDocFormat, System.Web.HttpContext.Current.Response, true, pdfReportName); 
    } 

と私が持っているデータセットを取得する:

私はレポートをレンダリングするメソッドを呼び出し

private DataSet GetReportData(DateTime from, DateTime to, int userID, bool totalsOnly) 
    { 
    DataTable Job = _reportRepository.GetAccountHistoryJob(from, to, userID, totalsOnly); 
    Job.TableName = "Accounts"; 
    DataSet ds = new DataSet("AccountsDS"); 
    ds.Tables.AddRange(new DataTable[] { Job }); 
    return ds; 
    } 

と限り私が懸念していて、以下の方法をリモートSQLサーバーに接続するために私を助けることになっているものです。

private void SetDBLogonForReport(ref ReportDocument reportDocument) 
    { 
    SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(ConfigurationManager.ConnectionStrings["MyConnectionString"].ToString()); 
    ConnectionInfo connectionInfo = new ConnectionInfo(); 
    connectionInfo.DatabaseName = builder.InitialCatalog; 
    connectionInfo.UserID = builder.UserID; 
    connectionInfo.Password = builder.Password; 
    connectionInfo.ServerName = builder.DataSource; 

    Tables tables = reportDocument.Database.Tables; 
    foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables) 
    { 
     TableLogOnInfo tableLogonInfo = table.LogOnInfo; 
     tableLogonInfo.ConnectionInfo = connectionInfo; 
     table.ApplyLogOnInfo(tableLogonInfo); 
    } 
    } 

なぜこれが動作しませんか?私はちょうど.xmlデータセットがローカルで使用されているので、取得するSQLデータセットをどのように使用するのかを理解しましたか?

+0

私はこの問題を尋ねたとCrystalレポートのサポートフォーラムに数多くの時間が解決されていると信じています。つまり、私は自分自身でこの問題を抱えていました。それを解決するために、クリスタルレポートを再インストールする権限を掘り下げていました。 – Joakim

+0

さて、どうやってそれを最後に解決しましたか?あなたはそれをデバッグするために何をしましたか? SQLプロファイラを見て、Webサーバーがストアドプロシージャを呼び出していることがわかりました。 –

+0

実際に私が恐れている正確な問題を正確に突き止めるにはあまりにも多くのことをしました。サーバー上のCrystalレポートバージョンが最新ではなく、ユーザー権限が正しくありません。構成ファイルの中に ""を追加しました。 – Joakim

答えて

2

これは私のために働いコードです:

public ActionResult TestReport() { 
    RenderCrystalReports("demoRPT.rpt", "Some Report", GetReportDs()); 
    return View(); 
} 


#region Private methods 
private void RenderCrystalReports(string rptName, string pdfReportName, DataSet dataForReport) 
{ 
    string reportPath = Server.MapPath(@"\Reports\" + rptName); 
    ReportDocument report = new ReportDocument(); 
    report.Load(reportPath, OpenReportMethod.OpenReportByTempCopy); 

    DataTable jobTable = GetReportTable(); 
    report.Database.Tables[0].SetDataSource(jobTable); 

    report.ExportToHttpResponse(ExportFormatType.PortableDocFormat, System.Web.HttpContext.Current.Response, true, pdfReportName); 

} 

private DataTable GetReportTable() 
{ 
    DataTable Job = GetReportData(); 
    Job.TableName = "Accounts"; 
    return Job; 
} 

private DataSet GetReportDs() 
{ 
    DataTable Job = GetReportData(); 
    Job.TableName = "Accounts"; 
    DataSet ds = new DataSet("AccountsDS"); 
    ds.Tables.AddRange(new DataTable[] { Job }); 
    return ds; 
} 

private DataTable GetReportData() 
{ 
    DataTable table = new DataTable(); 
    table.Columns.Add("Date", typeof(DateTime)); 
    table.Rows.Add(DateTime.Now); 
    return table; 
} 
#endregion 
関連する問題