【问题标题】:Crystal Report : Report is not being able to connect to the database as assignedCrystal Report:报表无法连接到分配的数据库
【发布时间】:2011-03-09 09:42:51
【问题描述】:

我们已经在目标机器上部署了我们的 ASP.NET 应用程序。该应用程序包含一些水晶报告(rpt 文件),并在调用时传递数据库连接详细信息。它在测试服务器上运行良好。但是在目标服务器上,水晶报表在被调用时会询问数据库连接的详细信息。它询问四个参数,即服务器、数据库、用户 ID、密码。其中,前两个文本框被禁用。服务器编辑框显示我传递的服务器的 ip。但是数据库参数显示为空白。我期待我在连接字符串中设置的初始目录。用户 id 显示的是我传递的用户 id。

配置文件有如下连接字符串:

<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"/>

在设置值时,我们从配置中获取它们并通过以下方法设置到报告中:

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 原生客户端存在一些问题。有人可以帮忙吗?

【问题讨论】:

  • 您有用于更新报告上的连接详细信息的代码吗?这可能是一个棘手的领域。它是否可能对 Test 起作用,因为这是最初编写报告的地方?
  • 是的,康侃,我也调查过,Sql native 有问题。OleDb 适配器可以解决你的问题。试一试。

标签: asp.net crystal-reports


【解决方案1】:

如果您从 web.config 本身获取连接属性会怎样。根据需要拆分或在

中添加键值
<appsettings add key="Datasource" value="19.168.10.1"> </appsettings>

等等。

【讨论】:

  • 我已经更新了我的帖子以说明清楚。所以你建议的答案并不成立。
  • @AmRam:谢谢。我已经用 OLEDB 替换了 NativeClient,可以解决这个问题。
猜你喜欢
  • 2016-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 1970-01-01
相关资源
最近更新 更多