2012-08-16 88 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查詢構建器組件」。