【问题标题】:Error When Printing Crystal Report That Uses SQL Stored Procedure打印使用 SQL 存储过程的 Crystal 报表时出错
【发布时间】:2019-09-24 04:36:57
【问题描述】:

我创建了一个使用 SQL Server 存储过程作为数据源的 Crystal Report。存储过程有一个参数。当下面的代码运行时,我在 obj.PrintToPrinter 行得到“数据库登录失败”。

如果我从报告中删除存储过程并将其替换为存储过程中使用的相同表并使用相同的参数,则不会出错。报告打印没有问题!

任何帮助将不胜感激,我真的很想为我们的报告使用存储过程。谢谢!

        ReportDocument obj = new ReportDocument();


        string m_rptname = "C:\\Reports\\MyReport.rpt";
        obj.Load(m_rptname);

        obj.SetParameterValue(0, "123456");

        foreach (Table tbl in obj.Database.Tables)
        {
            TableLogOnInfo tli = tbl.LogOnInfo;
            tli.ConnectionInfo.ServerName = "myServer";
            tli.ConnectionInfo.UserID = "myUser";
            tli.ConnectionInfo.Password = "myPass";
            tli.ConnectionInfo.DatabaseName = "myDB";

            tbl.ApplyLogOnInfo(tli);
        }

        //The line below is where the error happens for stored proc only
        obj.PrintToPrinter(2, false, 0, 0);
        obj.Close();
        obj.Dispose();

【问题讨论】:

    标签: c# sql-server winforms stored-procedures crystal-reports


    【解决方案1】:

    以下是您可能已经尝试过或尚未尝试过的几件事...

    1. 为了将问题隔离到 Crystal Reports,您是否尝试过编写一个函数来通过直接 SQL 连接执行该过程?这将允许您测试您的凭据和 SQL 权限。

    2. 我在您的连接设置中没有看到任何关于集成安全的信息,您可能需要仔细检查一下。由于您传递的是用户名/密码,我假设您没有使用 Windows 身份验证,可能需要 Integrated Security = false

    3. 您的报告是否有任何子报告?如果是这样,您将需要像处理表一样设置连接信息。

    4. 检查您的数据源是否与数据库不同步。要从报表设计器执行此操作,请选择数据库 -> 验证数据库。

    如果这些选项不起作用,请告诉我,我可以进行更多挖掘。一旦您解决了“陷阱”,Crystal 报表就非常棒。

    【讨论】:

    • 谢谢,连接 b/c 一切都很好,只要我不在报告源中使用存储过程,我就可以运行报告和打印。如果我拖入存储过程使用的所有相同表,然后运行相同的 c# 代码,报告将按预期打印。没有子报表,此时没有任何额外内容,因为我已将报表精简为从 select 语句和一个参数返回的几个字段。这没有任何意义......也许我已经使用 SSRS 太久了,似乎一切正常!
    • 再次感谢 Scope Creep 的反馈,我们已经取得了一些进展。根据您的建议 #2,我们对此进行了进一步调查。我们实际上能够让事情发挥作用,但这是通过反复试验......所以我希望你能有所启发。如果我们进入 Database Expert 并且 Integrated Security 为 True,然后在 c# 应用程序中我们使用 Integrated Security 为 False,则使用存储过程的报告最终可以工作。令人费解的是为什么?有任何想法吗?再次感谢您的帮助!
    • 很高兴你能够让它工作! Integrated Security = True 向 SQL Server 指示应使用当前的 Windows 帐户凭据进行身份验证。 Integrated Security = False 向 SQL Server 指示连接将使用 SQL 用户用户名/密码组合进行身份验证。听起来,是您不小心将两者混合在一起,这是行不通的。如果 Integrated Security 设置为 True,则无法发送用户名/密码。如果设置为 false,则必须发送用户名/密码
    • 我能够用存储过程“解决”这个问题的唯一一种方法是创建一个具有集成安全性的新连接并更改过程的“数据源位置”。
    猜你喜欢
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 2015-05-22
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    相关资源
    最近更新 更多