我們已經在目標機器上部署了我們的ASP.NET應用程序。該應用程序包含一些水晶報告(rpt文件),並在調用時傳遞數據庫連接詳細信息。它在測試服務器上工作正常。但是在目標服務器上,被調用的水晶報表要求提供數據庫連接細節。它要求四個參數作爲服務器,數據庫,用戶標識,密碼。其中,前兩個文本框被禁用。服務器編輯框顯示我通過的服務器的IP地址。但數據庫參數顯示爲空白。我期待着我在連接字符串中設置的初始目錄。用戶標識顯示我通過的用戶標識。Crystal Report:報告無法連接到分配的數據庫
配置文件具有連接字符串,如:
<add name = "reportdb" connectionString = "Data Source=172.16.7.85;Initial Catalog=reportdb;Persist Security Info=True;User ID=sa;Password=sa;" providerName = "System.Data.SqlClient"/>
雖然設置我們從配置THES並通過一個方法設置到報告中的值:
public int GenerateReport(CrystalReportViewer crystalReportViewer, string userid, string password, string server,string databaseName)
{
reportDoc = new ReportDocument();
subreportDocument = new ReportDocument();
Sections sections;
SubreportObject subreportObject;
ReportObjects reportObjects;
ConnectionInfo connectionInfo = new ConnectionInfo();
TableLogOnInfo tableLogOnInfo = new TableLogOnInfo();
Database database;
Tables tables;
CrystalDecisions.CrystalReports.Engine.Table crTable;
connectionInfo.DatabaseName = databaseName;
connectionInfo.UserID = userid;
connectionInfo.Password = password;
connectionInfo.ServerName = server;
reportDoc.Load(reportName);
database = reportDoc.Database;
tables = database.Tables;
tableLogOnInfo.ConnectionInfo = connectionInfo;
for (int i = 0; i < tables.Count; i++)
{
crTable = tables[i];
tableLogOnInfo = crTable.LogOnInfo;
tableLogOnInfo.ConnectionInfo = connectionInfo;
crTable.ApplyLogOnInfo(tableLogOnInfo);
}
sections = reportDoc.ReportDefinition.Sections;
foreach (Section crSection in sections)
{
reportObjects = crSection.ReportObjects;
foreach (ReportObject crReportObject in reportObjects)
{
if (crReportObject.Kind == ReportObjectKind.SubreportObject)
{
subreportObject = (SubreportObject)crReportObject;
subreportDocument = subreportObject.OpenSubreport(subreportObject.SubreportName);
database = subreportDocument.Database;
tables = database.Tables;
foreach (CrystalDecisions.CrystalReports.Engine.Table aTable in tables)
{
tableLogOnInfo = aTable.LogOnInfo;
tableLogOnInfo.ConnectionInfo = connectionInfo;
aTable.ApplyLogOnInfo(tableLogOnInfo);
}
}
}
}
foreach (DataRow dataRow in reportDetailDataTable.Rows)
{
//because it'll be null for optional parameter
////if (!string.IsNullOrEmpty(dataRow["Parameter value"].ToString()))
////{
ParameterFieldDefinition parameterFieldDefinition = null;
ParameterValues parameterValues = null;
ParameterDiscreteValue parmeterDiscreteValue = null;
parameterValues = new ParameterValues();
parameterFieldDefinition = reportDoc.DataDefinition.ParameterFields[dataRow[0].ToString()];
parmeterDiscreteValue = new ParameterDiscreteValue();
parmeterDiscreteValue.Value = dataRow[2].ToString();
parameterValues.Add(parmeterDiscreteValue);
parameterFieldDefinition.ApplyCurrentValues(parameterValues);
}
if (reportDoc.Database.Tables.Count > 0)//i.e only if report has table
{
reportDoc.Database.Tables[0].ApplyLogOnInfo(tableLogOnInfo);
}
crystalReportViewer.ReportSource = reportDoc;
return -1;
}
所以,我感覺水晶報表或SQL本機客戶端存在一些問題。有人可以幫忙嗎?
你有用於更新報告上連接細節的代碼嗎?這可能是一個棘手的領域。它是否有可能對測試起作用,因爲這是報告初始寫入的地方? – 2011-03-09 09:45:27
是康康,我也研究過這件事,Sql native有一些問題.. OleDb適配器可以解決你的答案。試一試。 – 2011-03-09 17:57:28