2011年2月15日 星期二

ASP.NET 3.5 + Crystal Report

狀況一:系統找不到指定的檔案。
錯誤訊息:在指定dataset 給CrystalReportSource1 的這一行

Me.CrystalReportSource1.ReportDocument.SetDataSource(ds)



我應該最近寫程式有點鬼打牆了,明明就這樣寫就好,怎麼一直在那邊轉圈圈啊!! 哈哈哈

目前整理出的寫法:
先在頁面上放一個CrystalReportViewer1,就可以開始寫了,但我不知道crystalreportSource該怎麼用。

Dim sCN0 As String = "資料庫連線字串"
Dim commandText As String = "資料庫查詢語法"
Dim da As SqlDataAdapter = New SqlDataAdapter(commandText, sCN0)

 '建立一個 DataSet 物件。如果要塞入一個實體的dataset ,名稱一定要打對喔!!
' 例如我新增的一個叫做dsReport的dataset,它的datatable叫做dt_rpt
 Dim ds As dsReport = New dsReport()
 da.Fill(ds, "dt_rpt")

' 這個crystal report的路徑要注意,如果你的程式是放在資料夾下的話,它會認為你的crystalReport也是在同個路徑喔!!
'所以記得放對地方
'我記得我在寫windows form 的時候不用指定路徑啦,但不知道為什麼asp.net要
 Dim rptFile = Server.MapPath("rpOrderRpt.rpt")
 Dim doc As New ReportDocument
 doc.Load(rptFile)

''將dataset指定為ReportDocument的setDatasource
 doc.SetDataSource(ds)
 Me.CrystalReportViewer1.ReportSource = doc






狀況二:
登入失敗。細目: crdb_adoplus : 並未將物件參考設定為物件的執行個體檔案 C:\DOCUME~1\chenyu\LOCALS~1\Temp\rpOrderRpt {BF7D59DE-BDB8-4F0E-9875-2B9470BDBEB6}.rpt 錯誤: 無法連接: 登入參數錯誤


這個問題的話,我知道為什麼,但不知道該怎麼改,
狀況二就是只要資料庫連線資料是寫在function裡,總之不跟程式同一個頁面的話,例如我把去資料庫抓資料的程式全部寫在GetReport.GetReportA的function裡傳回datatable,
然後在產生報表的程式把datatable傳回,這樣就會出現上面的錯誤訊息了,


DTA = GetReport.GetReportA(Me.txtFromDate.Text, Me.txtToDate.Text).Copy


不知道是什麼問題,我有試著把連線字串宣告的區域變大,不過似乎不是這個問題,
只好繼續找方法囉!
如果有試出來再發文囉!


2/16更新
狀況二已經試出來了,
跟什麼連線字串的宣告變數無關啦,之前確實推斷錯誤,
剛試出來的結果:
新建的dataset中無論是DataTable或是TableAdapter,名稱要與資料庫的tableName一樣,否則就會出現狀況二的錯誤訊息,
只要改成跟資料庫的tableName一樣,無論是DataTable或是TableAdapter都不會有問題,再者,資料表的欄位可以不用一樣也沒關係。


以上就是目前的解決方案,
但還是覺得不方便,我就是想跟資料庫的tableName不一樣不行嗎?呵呵
繼續測試囉,有新發現再po上來喔!!


2/17更新
狀況三:
Crystal Report頁面按下一頁或是匯出報表都會出現像狀況二那樣的問題。


因為按下一頁或是匯出,都是觸發page_load,
所以目前我是在page_load的時候,再呼叫一次產生報表的程式,這樣就可以了,
但還是覺得這個方法有點…不太好…所以想到再po上來囉!!






資料來源:自己測試及參考
http://social.msdn.microsoft.com/Forums/zh-TW/236/thread/83b8206d-c4b0-4f62-8725-365f5b7b1ebc
http://www.blueshop.com.tw/board/FUM20041006161839LRJ/BRD201102141042154LH.html

沒有留言:

張貼留言