0

我有一个 SQL 数据库和一个用于将数据放入数据库的 ASP.NET 网站。

项目要求之一是构建一个系统,允许用户将 Crystal Report 上传到服务器并根据需要运行它。这样,用户可以创建一个定制的报告(然后变成管理,客户),而不会强迫他们通过开发人员。

我正在寻找有关如何实现这一目标的建议。

目前,我正在寻找一种方法,将 Crystal Report 中的数据库连接从开发它的数据库重定向到最终将运行的数据库。但是,似乎没有一种简单的方法可以做到这一点。

我也在调查 ReportViewer 对象。但是,我看到的所有代码都涉及在代码中指定报表的查询,这是不可接受的。

一种选择(我根本不喜欢)是让他们编写自己的查询,以便他们可以将结果复制到 Excel 中。这将意味着一个空白文本框和有关数据库结构的信息。由于多种原因,这不是一个好主意。

另一种选择是为每个表创建一个报告(可能还有一些额外的),让用户将他们想要的数据复制到 Excel 中,然后继续他们的快乐方式。

tl;dr 如何构建灵活的报告系统?

==========================================
续: 2012 年 8 月 20 日
我有决定走 b.pell 扩展方法的路线。到目前为止,它让我比其他任何事情都更接近。我绑定到 CrystalReportViewer 的代码如下:

CrystalReportSource rs = new CrystalReportSource();
rs.Report.FileName = Server.MapPath("ReportFiles/") + Request["reportname"];
string connstring = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString;
rs.ReportDocument.ApplyCredentialsFromConnectionString(connstring);
rs.ReportDocument.ApplyNewDatabaseName("myDBName", "mySchemaName");
rs.ReportDocument.Refresh();

CrystalReportViewer1.ReportSource = rs;

这非常接近工作。它在我的开发机器上运行良好,但是当我在服务器上运行代码时,它给出了以下错误:

登录失败。文件 CrystalReport2 {5D2E82E5-783E-4DFD-A770-C8AE72A51E4E}.rpt 中的错误:无法连接:登录参数不正确。说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。异常详细信息: System.Runtime.InteropServices.COMException:登录失败。文件 CrystalReport2 {5D2E82E5-783E-4DFD-A770-C8AE72A51E4E}.rpt 中的错误:无法连接:登录参数不正确。源错误:在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。

错误在代码的这一行中:

crTable.Location = String.Format("{0}{1}", 前缀, crTable.Location.Substring(crTable.Location.LastIndexOf(".") + 1))

当我删除对 ApplyNewDatabaseName 的调用时,系统会要求我输入服务器名称、数据库名称、用户名和密码,或者选择集成安全性。我无法输入数据库名称或服务器名称(这些字段被禁用)。

有什么想法吗?

4

3 回答 3

1

我认为您正在寻找的是报告服务,它是商业智能的一部分, 或者您可以设置一个 UI,让用户选择报告所需的表和列(这样您可以限制他们可以访问的信息)编写一个动态查询生成器函数或类似的东西。

于 2012-08-16T20:58:50.563 回答
1

我经常回答不断变化的 Crystal Reports 连接问题(我认为 Crystal 会变得更容易,但我想知道他们是否不这样做,因为他们的服务器产品就是这样做的)。:D 无论如何,您可以在运行时设置数据库凭据。Crystal 在完成的顺序上非常特别,但我有一些代码可以转化为扩展方法来解决问题。此代码将遍历主报告和所有子报告并更改连接信息。这假设所有子报表都连接到与主报表相同的数据库(如果没有,您需要对其进行修改以处理多个连接,但这至少在我所做的情况下很少出现)。

更改连接信息的扩展方法:http: //www.blakepell.com/2012-05-22-crystal-reports-extension-methods

它将像这样使用(尽管您可能绑定到查看器而不是导出,因此您可以忽略它,这只是示例)。

Using rd As New ReportDocument 
    rd.Load("C:\Temp\CrystalReports\InternalAccountReport.rpt") 
    rd.ApplyNewServer("serverName or DSN", "databaseUsername", "databasePassword") 
    rd.ApplyParameters("AccountNumber=038PQRX922;", True) 
    rd.ExportToDisk(ExportFormatType.PortableDocFormat, "c:\temp\test.pdf") 
    rd.Close() 
End Using 

System.Diagnostics.Process.Start("c:\temp\test.pdf") 

此时您可以使用 Crystal Viewer 来交付报告并将报告存储在数据库或文件系统中(使用 db 元数据表),并具有一些用户可以从中选择的预定义连接,当它被应用时跑。

您还可以选择编写自己的前端。在这种情况下,用户将从您的元数据中选择一个报告(您可以在其上设置任何您想要的安全性,我使用 AD)。然后,您可以读取报表参数并将它们布置在 Web 表单上。当用户填写它们时,您然后对它们进行清理并通过这些扩展将它们传递给报告,您可以输出 Excel、PDF、Word Doc、RTF 等。更多的开销而不是漂亮的预览视图,但可以很好地工作(我过去做过类似的事情)。希望这可以帮助。

于 2012-08-18T17:20:43.900 回答
0

关于“......让他们编写自己的查询”是您问题的一部分。

解决方案可以是使用一些具有友好用户界面的查询构建器组件,它向用户隐藏数据库的复杂性并避免任何可能的 SQL 注入。

市场上此类产品很少。其中一个叫做 EasyQuery,如果我没记错的话,另一个是由 Aspose 构建的。尝试在 Google 中搜索“query bulider for asp.net”或“.net query builder component”。

于 2012-08-28T07:42:47.150 回答