c# - 使用 ODBC 连接在代码隐藏中加载 Crystal Report

标签 c# asp.net crystal-reports

我有一组当前代码,用于通过服务器连接加载 C# 中的 Crystal 报表。

以下是加载报告的代码:

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 连接的名称,但这仍然返回相同的无法打开连接。无法打开连接。错误。

问题:我似乎无法弄清楚可以在 ConnectionInfo 中更改什么才能使其成功使用 ODBC 连接。我不断收到无法打开连接的消息。打开连接失败。

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

提前致谢!

最佳答案

运行时设置 ODBC 连接是 rather tricky ,主要是因为需要设置所有这些附加的“登录属性”和“连接属性”:

// 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);
}

关于c# - 使用 ODBC 连接在代码隐藏中加载 Crystal Report,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31455180/

相关文章:

c# - 使用求和函数得到错误答案

c# - 在显示表单之前/显示时在 DataGridView 上设置单元格字体

c# - 在 System.Xml.XPath 中启用 XPath2 查询(XPathException : invalid token)

javascript - 在 ASP.NET 页面中安装 jQuery 图像 slider ?

c# - CS1009 : Unrecognized escape sequence

asp.net - 我怎样才能让asp.net mvc显示一个漂亮的500错误消息?

crystal-reports - Crystal 报表 : Create Array or get values from a column

c# - 如何获取控制台应用程序的屏幕大小?

crystal-reports - Crystal Reports 中交叉表报表的行标题

c# - .Net Crystal Report 打印应用程序在 session 断开时运行在终端服务连接错误上