使用Crystal Reports for .net时出现错误

6

我编写了一个程序,可以从Crystal Report生成PDF文件,并将这些PDF文件发送电子邮件给某些人。 在我的开发机器上,该程序运行良好,但是当我将bin \ Release目录复制到Windows 2000 Server(我想要运行它的计算机)时,它开始运行,然后生成以下错误和堆栈跟踪信息:

The type initializer for 'CrystalDecisions.CrystalReports.Engine.ReportDocument' threw an exception.
   at CrystalDecisions.CrystalReports.Engine.ReportDocument..ctor()
   at DailyJobCostSummaryEmail.Program.crptToPDF(String reportFile, String jobNum, String outputLocation) in M:\Projects\DailyJobCostSummaryEmail\DailyJobCostSummaryEmail\Program.cs:line 79
   at DailyJobCostSummaryEmail.Program.Main(String[] args) in M:\Projects\DailyJobCostSummaryEmail\DailyJobCostSummaryEmail\Program.cs:line 46

除了在Visual Studio中运行时,错误随处可见。

该机器上安装了.Net 2.0,并且我已经安装了CRRedist2005_x86.msi,但没有效果。即使我使用try / catch将异常打印到文件中,我甚至还会收到“发送错误报告给Microsoft”的对话框。即使catch块执行,我的程序也无法正确关闭。

static void Main(string[] args)
{
    try
    {
        String dir = @"JobCostReports";
        DataTable jobs = new DataTable();

        using (SqlConnection conn = new SqlConnection(connString))
        {
            String sql = "JC_GetJobsClosedYesterday";
            SqlDataAdapter da = new SqlDataAdapter(sql, conn);
            da.Fill(jobs);
        }

        List<String> files = new List<String>();

        foreach (DataRow row in jobs.Rows)
        {
           files.Add(crptToPDF(@"JobCost.rpt", row["JobNumber"].ToString().TrimEnd(), dir));
        }

        Utilities.sendEmail("[toEmail]",
                            "[FromEmail]",
                            "Job Cost Summaries for Yesterday",
                            "Attached are Job cost summaries for the " + files.Count + " jobs closed yesterday.",
                            files.ToArray());

        Console.WriteLine("Email sent.");
    }
    catch (Exception e)
    {
        using (StreamWriter writer = new StreamWriter("errors.log", true))
        {
            writer.AutoFlush = true;
            Console.WriteLine();
            writer.WriteLine(e.Message);
            writer.WriteLine(e.StackTrace);
        }

        Console.WriteLine(e.Message);
        Console.WriteLine(e.StackTrace);
        Console.Read();
    }
    finally { }
}

public static String crptToPDF(String reportFile, String jobNum, String outputLocation)
{
    using (ReportDocument rpt = new ReportDocument())
    {
        rpt.Load(reportFile);
        rpt.SetParameterValue("@vJobNumber", jobNum);
        String output = outputLocation + @"\" + jobNum + "_JobCostSummary.pdf";
        rpt.ExportToDisk(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat, output);
        return output;
    }
}

我是否没有包含所有必要的引用和使用语句?我尝试了很多组合,但没有效果。


2
尝试更新日志,同时包含异常的InnerException.Message。这将告诉您ReportDocument..ctor实际抛出了什么错误,从而为您提供更多的工作信息。 - Joe White
“除了从Visual Studio运行时,错误随处发生。” 当您从/bin目录运行时,它也会在您的计算机上出现吗?我曾经因为缺少依赖项而遇到过类似的错误... - BlueRaja - Danny Pflughoeft
6个回答

2

0
一个快速而简单的技巧,希望它能奏效。
据我所知,可能是生产环境中缺少引用或版本不匹配。为了解决这个问题,从您的解决方案中,进入到引用目录 -> 选择引用 -> 右键点击引用 -> 选择属性 -> 然后选择复制本地 - True。现在构建您的应用程序并将新的 bin 目录和页面复制到生产环境中,并检查它是否运行。如果仍不能运行,则再次进入引用的属性,选择路径。如果它在 GAC 中,请搜索谷歌以从 GAC 中复制 dll。或者您可以将 Windows 文件夹映射到同一台机器上,并通过目录导航到达并复制 dlls,但是需要管理员权限。现在在解决方案中创建一个名为 CRDist 的新目录,在其中粘贴所有的 dll,并从那里引用,在生产环境中,打开命令提示符并使用 regsvr32-i dll 路径注册 dll。
此外,在您的 PDF 导出机制中,我可以看到您正在加载报告文件,但您没有使用任何数据源。您是在设计时设置数据源还是有其他操作?
希望这会有所帮助。

水晶报表已经编程好了数据源,所以我不必从代码中搞它。老实说,.NET的水晶报表正在变得比它们值得的麻烦。我明天会尝试所有这些,但无论如何,我都要寻找一个更易于使用的报告平台。当然,我的选择是免费或什么都没有,所以我可能被卡住了。 - MAW74656
建议:如果您正在使用 Sql Server 进行报告,请使用 OleDb 而不是 Sql Native API。 - user240141
我正在使用SQL Server,您能详细说明一下您的建议吗?我还不太理解。您是指在哪里使用Oledb?我的代码中没有使用它们,数据来自于报表文件中声明的数据集。 - MAW74656
所有引用已设置为本地复制。现在正在检查其他建议。 - MAW74656
我授予您赏金是因为时间不多了,而且这是迄今为止最有用的建议。但我仍在努力看看它是否是答案。 - MAW74656
显示剩余7条评论

0

要注册托管程序集,请使用以下方法

C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322>RegAsm.exe /tlb dllName.dll
Microsoft (R) .NET Framework Assembly Registration Utility 1.1.4322.573
Copyright (C) Microsoft Corporation 1998-2002.  All rights reserved.


Here v1.1.4322 will the framework you are developing. Choose the framework 
accordingly. Or goto Start->AllPrograms -> MicrosoftVisual Studio 2005/8/10-> 
Visual Studio Tools-> Visual Studio Command Prompt. 
then run RegAsm.exe /tlb dllName.dll

我应该在哪台电脑上运行?开发机还是目标机? - MAW74656

0

这个似乎与之相关。你尝试过那里概述的步骤吗?


是的,之前找到过那个。没用。一个合并模块能够自己被安装吗? - MAW74656
@MAW74656 - 不,合并模块必须包含在实际的MSI中。请参见此处 - CodeNaked
我以前没有使用过合并模块。我该怎样将其添加到我的安装程序中? - MAW74656
@MAW74656 - 这里是一个演示教程:http://msdn.microsoft.com/zh-cn/library/aw2dz878(v=vs.80).aspx - CodeNaked
我被要求输入产品密钥。我只是使用随附我的Visual Studio 2008的CR版本。我从未输入过任何产品密钥。你知道在哪里/如何找到它吗? - MAW74656

0

检查在Visual Studio中的调试和发布解决方案配置是否具有相同的依赖项和设置,并且所有依赖路径都是相对的;当在VS中工作但在外部不起作用时,我通常发现这是那两个问题之一。


调试和发布是一样的。所有路径都是相对的。 - MAW74656

0
服务器配置不正确,我很抱歉。 从SAP(而不是VS)重新安装它的运行时,你可以通过谷歌搜索找到。 当你说你想在服务器上运行它时,你是作为一个网站运行它,还是将RPT放在网络共享上,还是其他情况? 如果是网站,那么几乎毫无疑问是服务器上安装了配置错误的Crystal - 不是你的报表本身。
我不认为(但不确定),运行时安装会在任何时候要求你输入产品密钥,因为你只是使用免费的查看器等。如果要求你输入产品密钥,则恐怕你没有安装纯粹的运行时。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接