2011-03-09 66 views
0

我們已經在目標機器上部署了我們的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本機客戶端存在一些問題。有人可以幫忙嗎?

+0

你有用於更新報告上連接細節的代碼嗎?這可能是一個棘手的領域。它是否有可能對測試起作用,因爲這是報告初始寫入的地方? – 2011-03-09 09:45:27

+1

是康康,我也研究過這件事,Sql native有一些問題.. OleDb適配器可以解決你的答案。試一試。 – 2011-03-09 17:57:28

回答

1

如果從web.config本身獲取連接屬性,該怎麼辦?根據需要將其拆分或添加鍵值

<appsettings add key="Datasource" value="19.168.10.1"> </appsettings> 

等等。

+0

我已更新我的帖子以說清楚。所以你提出的答案並不好。 – Kangkan 2011-03-09 17:38:51

+0

@AmRam:謝謝。我用OLEDB替換NativeClient並可以解決問題。 – Kangkan 2011-03-17 10:59:30