2011-03-09 129 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

相关问题