C# 打印使用SQL存储过程的Crystal报表时出错

C# 打印使用SQL存储过程的Crystal报表时出错,c#,sql-server,winforms,stored-procedures,crystal-reports,C#,Sql Server,Winforms,Stored Procedures,Crystal Reports,我创建了一个Crystal报表,它使用SQL Server存储过程作为数据源。存储过程有一个参数。当下面的代码运行时,我在obj.PrintToPrinter行获取数据库登录失败 如果我从报告中删除存储过程,并将其替换为存储过程中使用的相同表,并使用相同的参数,则不会出现错误。报告打印时没有问题 如果有任何帮助,我将不胜感激,我真的很想为我们的报告使用存储过程。谢谢 ReportDocument obj = new ReportDocument(); stri

我创建了一个Crystal报表,它使用SQL Server存储过程作为数据源。存储过程有一个参数。当下面的代码运行时,我在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();

以下是一些你可能已经尝试过或没有尝试过的东西

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

我在您的连接设置中没有看到任何关于集成安全性的内容,您可能需要再次检查。由于您正在传递用户名/密码,因此我假设您没有使用Windows身份验证,并且可能需要使用Integrated Security=false

您的报告有任何子报告吗?如果是这样,您需要像设置表一样设置连接信息

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


如果这些选项不起作用,请告诉我,我可以做更多的挖掘。一旦你解决了问题,Crystal reports就非常棒。

谢谢,连接一切都很好b/c我可以运行报告并打印,只要我不在报告源中使用存储过程。如果我拖入存储过程使用的所有相同的表,然后运行与预期相同的c代码,则报告将按预期打印。没有子报表,在这一点上没有额外的内容,因为我已经将报表精简为从select语句和一个参数返回的几个字段。这没有任何意义…也许我已经使用SSR太长时间了,在那里一切似乎都正常!再次感谢您的反馈,我们已经取得了一些进展。根据您的建议2,我们对此进行了进一步调查。事实上,我们能够让事情顺利进行,但这是通过尝试和错误…所以我希望你们能给我们一些启示。如果我们进入Database Expert,并且Integrated Security为True,然后在c应用程序中使用Integrated Security为False,那么使用存储过程的报告最终会起作用。令人费解的是为什么?有什么想法吗?再次感谢你的帮助!很高兴你能让它工作!Integrated Security=True向SQL Server指示应使用当前Windows帐户凭据进行身份验证。integratedsecurity=False向SQL Server指示将使用SQL用户用户名/密码组合对连接进行身份验证。听起来像是你不小心把这两者混在一起了,这是行不通的。如果集成安全设置为True,则无法发送用户名/密码。如果设置为false,则必须发送用户名/密码。我能够解决存储过程此问题的唯一方法是创建具有集成安全性的新连接,并更改过程的数据源位置。