我有一个SQL数据库和一个ASP.NET网站,用于将数据放入数据库。
项目要求之一是构建一个系统,让用户将Crystal Report上传到服务器并根据需要运行它。这样,用户可以创建一个自定义报告(然后转变为管理,客户),这不会强迫他们通过开发人员。
我正在寻找有关如何实现这一目标的建议。
目前,我正在寻找一种方法将Crystal Report中的数据库连接从它开发的数据库重定向到最终运行的数据库。但是,似乎没有一种简单的方法可以做到这一点。
我也正在调查ReportViewer对象。但是,我看到的所有代码都涉及在代码中指定报告的查询,这是不可接受的。
一个选项(我根本不喜欢)是让他们编写自己的查询,以便他们可以将结果复制到Excel中。这将意味着一个空白文本框和有关数据库结构的信息。出于多种原因,这不是一个好主意。
另一个选择是为每个表创建一个报告(可能还有一些额外的),让用户将他们想要的数据复制到Excel中,然后继续他们的快乐方式。
tl; dr如何构建灵活的报告系统?
=========================================
延续: 08/20/2012
我决定采用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:Logon failed.Error文件CrystalReport2中的错误{5D2E82E5-783E-4DFD-A770-C8AE72A51E4E} .rpt:无法连接:登录参数不正确。 源错误:在执行当前Web请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息。
错误在代码中的这一行:
crTable.Location = String.Format(“{0} {1}”,prefix,crTable.Location.Substring(crTable.Location.LastIndexOf(“。”)+ 1))
当我删除对ApplyNewDatabaseName的调用时,系统会要求我输入服务器名称,数据库名称,用户名和密码,或者选择集成安全性。我无法输入数据库名称或服务器名称(这些字段已禁用)。
有什么想法吗?
答案 0 :(得分:1)
我认为您正在寻找的是Reporting Services,Business Intelligence的一部分 或者,您可以设置一个用户界面,让用户选择报表所需的表格和列(这样可以限制他们可以访问的信息),编写一个Dinamic查询生成器函数或类似的东西。
答案 1 :(得分: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等。稍微增加开销而不是很好的预览视图,但可以很好地工作(我过去做过类似的事情)。希望这会有所帮助。
答案 2 :(得分:0)
关于“......让他们自己编写查询”是你问题的一部分。
解决方案可以是使用一些具有友好用户界面的查询构建器组件,该组件向用户隐藏数据库的复杂性并避免任何可能的SQL注入。
市场上很少有这样的产品。其中一个叫做EasyQuery,另一个叫Aspose,如果我没错的话。尝试在Google中搜索“asp.net的查询bulider”或“.net查询构建器组件”。