【问题标题】:Using an ODBC connection to load a Crystal Report in Code-Behind使用 ODBC 连接在代码隐藏中加载 Crystal Report
【发布时间】:2015-07-16 13:11:45
【问题描述】:

我有一组当前的代码用于在 c# 中通过服务器连接加载 Crystal Report。

这是加载报告的代码:

CrystalReportViewer1.ParameterFieldInfo.Clear();
string reportName = Request.QueryString["rpt"];
if (reportName != null)
{
    crystalReport = new ReportDocument();
    crystalReport.Load(@"\\esco-iis\crystalreports\purchasing\po.rpt");
    //crystalReport.Load(@"\\esco\crystalreports\purchasing\po.rpt");

    var connectionInfo = new ConnectionInfo();
    connectionInfo.ServerName = "server";
    connectionInfo.DatabaseName = "database";
    connectionInfo.Password = "pass";
    connectionInfo.UserID = "user";
    connectionInfo.IntegratedSecurity = false;
    crystalReport.SetDatabaseLogon("user", "pass", "server", "database");
    Tables CrTables = crystalReport.Database.Tables;
    TableLogOnInfo crtableLogoninfo = new TableLogOnInfo();
    foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in CrTables)
    {
        crtableLogoninfo = CrTable.LogOnInfo;
        crtableLogoninfo.ConnectionInfo = connectionInfo;
        CrTable.ApplyLogOnInfo(crtableLogoninfo);
        CrystalReportViewer1.LogOnInfo.Add(crtableLogoninfo);

    }

    foreach (ReportDocument report in crystalReport.Subreports)
    {
        report.SetDatabaseLogon("user", "pass", "server", "database");
        foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in report.Database.Tables)
        {
            crtableLogoninfo = CrTable.LogOnInfo;
            crtableLogoninfo.ConnectionInfo = connectionInfo;
            CrTable.ApplyLogOnInfo(crtableLogoninfo);
            CrystalReportViewer1.LogOnInfo.Add(crtableLogoninfo);
        }
    }

    string PO = Request.QueryString["PO"];
    if (PO != null)
    {
        ParameterField parameter = new ParameterField();
        ParameterDiscreteValue parameterValue = new ParameterDiscreteValue();
        parameterValue.Value = PO;
        parameter.Name = "@PO";
        parameter.CurrentValues.Add(parameterValue);
        CrystalReportViewer1.ParameterFieldInfo.Add(parameter);
    }
}

当前状态:这在报表设置为直接连接到数据库时有效,但其中大约一半设置为使用 ODBC 连接。

尝试:我尝试将服务器名称切换为 ODBC 连接的名称,但这仍然返回相同的 Failed to open the connection. Failed to open the connection. 错误。

问题:我似乎无法弄清楚我可以在我的 ConnectionInfo 中进行哪些更改才能使其成功使用 ODBC 连接。我不断收到Failed to open the connection. Failed to open the connection.

我知道单独进行连接并设置报告源的解决方案,但这不可行,因为报告很多。

提前致谢!

【问题讨论】:

    标签: c# asp.net crystal-reports


    【解决方案1】:

    在运行时设置ODBC连接是rathertricky,主要是因为这些额外的“登录属性”和“连接属性”都需要设置:

    // DbConnectionAttributes contains some, but not all, consts.
    var logonProperties = new DbConnectionAttributes();
    logonProperties.Collection.Set("Connection String", @"Driver={SQL Server};Server=TODD-PC\SQLEXPRESS2;Trusted_Connection=Yes;");
    logonProperties.Collection.Set("UseDSNProperties", false);
    
    var connectionAttributes = new DbConnectionAttributes();
    connectionAttributes.Collection.Set("Database DLL", "crdb_odbc.dll");
    connectionAttributes.Collection.Set("QE_DatabaseName", String.Empty);
    connectionAttributes.Collection.Set("QE_DatabaseType", "ODBC (RDO)");
    connectionAttributes.Collection.Set("QE_LogonProperties", logonProperties);
    connectionAttributes.Collection.Set("QE_ServerDescription", @"TODD-PC\SQLEXPRESS2");
    connectionAttributes.Collection.Set("QE_SQLDB", true);
    connectionAttributes.Collection.Set("SSO Enabled", false);
    
    return new ConnectionInfo
               {
                   Attributes = connectionAttributes,
                   // These don't seem necessary, but we'll include them anyway: ReportDocument.Load does
                   ServerName = @"TODD-PC\SQLEXPRESS2",
                   Type = ConnectionInfoType.CRQE
               };
    

    另一方面,与其从头开始创建 ConnectionInfo 对象,不如使用现有的对象,尤其是如果您已经使用类似的连接设计了报表:

    foreach (Table crTable in crTables)
    {
        TableLogOnInfo tableLogOnInfo = crTable.LogOnInfo;
        var connectionInfo = tableLogOnInfo.ConnectionInfo;
    
        // set connection info stuff here
    
        crTable.ApplyLogOnInfo(tableLogOnInfo);
    }
    

    【讨论】:

    • @oppassum:嗯,我特别看到你的代码中有一行使用了new ConnectionInfo();
    • 按您的方式尝试。没有区别。
    【解决方案2】:

    对于使用 SQL Server ODBC 的旧报告,可能需要使用“SQL Server Native Driver 11.0”。

    class CrystalDatabase
        {
    
            public static TableLogOnInfo GetODBCTableLogOnInfo(string ODBCName, string serverName, string databaseName, string userID, string password)
            {
                CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag connectionAttributes = new CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag();
    
                connectionAttributes.EnsureCapacity(3);
                connectionAttributes.Add(DbConnectionAttributes.CONNINFO_CONNECTION_STRING, string.Format("DSN={0};Driver={{SQL Server}}", ODBCName));
                connectionAttributes.Add("Server", serverName);
                connectionAttributes.Add("UseDSNProperties", false);
    
                DbConnectionAttributes attributes = new DbConnectionAttributes();
                attributes.Collection.Add(new NameValuePair2("Database DLL", "crdb_odbc.dll"));
                attributes.Collection.Add(new NameValuePair2("QE_DatabaseName", databaseName));
                attributes.Collection.Add(new NameValuePair2("QE_DatabaseType", "ODBC (RDO)"));
                attributes.Collection.Add(new NameValuePair2("QE_LogonProperties", connectionAttributes));
                attributes.Collection.Add(new NameValuePair2("QE_ServerDescription", serverName));
                attributes.Collection.Add(new NameValuePair2("QE_SQLDB", true));
                attributes.Collection.Add(new NameValuePair2("SSO Enabled", false));
    
                ConnectionInfo connectionInfo = GetConnectionInfo(serverName, databaseName, userID, password);
                connectionInfo.Attributes = attributes;
                connectionInfo.Type = ConnectionInfoType.CRQE;
                connectionInfo.IntegratedSecurity = false;
                TableLogOnInfo tableLogOnInfo = new TableLogOnInfo();
                tableLogOnInfo.ConnectionInfo = connectionInfo;
                return tableLogOnInfo;
            }
    
            public static ConnectionInfo GetConnectionInfo(string serverName, string databaseName, string userID, string password)
            {
                ConnectionInfo connectionInfo = new ConnectionInfo();
                connectionInfo.ServerName = serverName;
                connectionInfo.DatabaseName = databaseName;
                connectionInfo.UserID = userID;
                connectionInfo.Password = password;
    
                return connectionInfo;
            }
        }
    

    这个类应该和类似这样的实现结合起来:crystal report failed to get data

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多