錯誤訊息:在指定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