我有一个 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 的调用时,系统会要求我输入服务器名称、数据库名称、用户名和密码,或者选择集成安全性。我无法输入数据库名称或服务器名称(这些字段被禁用)。
有什么想法吗?