2012-08-16 85 views
0

我有一个SQL数据库和一个ASP.NET网站,用于将数据放入数据库。在ASP.NET中报告

其中一个项目的要求是建立一个系统,让用户上传Crystal报表服务器,并根据需要运行它。通过这种方式,用户可以创建一个定制的报告(然后转变为管理层,客户),而不会强迫他们通过开发人员。

我在寻找如何完成此目标的建议。

目前,我正在寻找一种方法来重定向从它与该数据库最终将运行在开发数据库中的水晶报表数据库连接。然而,似乎没有一种简单的方法来做到这一点。

我还在研究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; 

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

Logon failed.Error in File CrystalReport2 {5D2E82E5-783E-4DFD-A770-C8AE72A51E4E}.rpt: Unable to connect: incorrect log on parameters. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.Runtime.InteropServices.COMException: Logon failed.Error in File CrystalReport2 {5D2E82E5-783E-4DFD-A770-C8AE72A51E4E}.rpt: Unable to connect: incorrect log on parameters. Source Error: An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

的错误是在这行代码:

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

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

有什么想法?

回答

1

我认为你要找的是Reporting Services,它是Business Intelligence 的一部分或者你可以设置一个UI,让用户选择他们需要的报表(这样你可以限制信息他们可以访问)编写一个Dinamic Query Builder功能或类似的东西。

+0

Reporting Services听起来像它可能工作。你有一个建议的教程,让我开始? – Brynne 2012-08-16 21:11:51

+1

@notkilroy还没看过,但我认为这是一个教程[Reporting Services](https://www.microsoftvirtualacademy.com/tracks/breakthrough-insights-using-microsoft-sql-server-2012-reporting-services) – saul672 2012-08-16 21:29:47

1

我的回答是不断变化的水晶报表的连接问题很多(这件事情我倒是觉得水晶将使容易,但我不知道,如果他们不这样做,因为这是他们的服务器产品做什么)。 :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") 

你可以使用水晶浏览器在这一点上提供的报告,并存储在数据库或文件系统(带有一个DB元数据表)上的报告,并有一些预定义的连接,用户可以从中选择这将在运行时应用。

您也可以选择编写自己的前端。在这种情况下,用户会从你的元数据中选择一个报告(你可以把它想要的任何安全性,我使用AD)。然后,您可以阅读报告参数并将其放在网络表单上。当用户填入时,您可以通过这些扩展名将其传递给报告,并且可以输出Excel,PDF,Word Doc,RTF等。稍微有些开销,而不是很好的预览视图,但可以很好地工作(我过去做过这样的事情)。希望这可以帮助。

+0

我一直在处理您的建议路线,并且遇到了设置数据库和模式名称的问题。我已经在原文中详细介绍了它,并且会喜欢你的建议。 – Brynne 2012-08-20 18:27:47

0

关于“......让他们自己写问题”是你问题的一部分。

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

市场上很少有这样的产品。其中一个叫做EasyQuery,另一个是Aspose,如果我没有错的话。尝试在Google中搜索“用于asp.net的查询管理器”或“.net查询构建器组件”。