引用(0)请拷贝:
1
【求助】VB.Net高手们进来瞅一瞅啦, CR问题
1 MacArthur 2006-11-07 16:24:22
正在学习VB.Net中,这个问题可能在高手眼里比较弱,多多包涵...
最近在用VB.Net 2002 + CrystalReport给别人做一个小小的reporting tool,非常简单,就是从OracleDB里读取数据然后通过CrystalReport生成Excel报表。
边学边做,VB的intellisense挺不错的,上手比较容易,表扬一个。
在我的开发机上,什么问题都没有了,Excel报表也能一次生成,毫无问题。
好了,作了个Setup Project,把所有东东包裹一下,生成一个MSI。
这个MSI里头,包括了"Database_Access.msm", "Database_Access_enu.msm"和"Regwiz.msm",还包括两个.rpt文件,因为用户有可能随后需要调整报表格式。
把MSI往用户机器上一装,却出问题了:Logon Failed
这个错误在VB/CR用户中似乎很常见,有不少文章都在谈论如何解决之。
可问题在于,别人都是在开发阶段遇上的这个问题,无论如何都可以debug一步步地看进程;到我这里呢,在自己的机器上没事儿,送到别人机器上就有事儿了,没法debug!
记得西河当初报家门的时候颇有几位.Net高手,请大家帮帮忙,分析分析是咋回事儿...
附上生成报表的源程序,希冀有人能瞅出端倪...
多谢多谢
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared
Private Sub generateCryatalReport(ByVal strReportName As String)
Dim strReportPath As String = Application.StartupPath & "\" & strReportName & ".rpt"
'Dim strReportPath As String = strReportName & ".rpt"
Try
If Not IO.File.Exists(strReportPath) Then
Throw (New Exception("Unable to locate report file:" & vbCrLf & strReportPath))
End If
Dim strSQL As String = "Select * From WLCM_PKG"
Dim DA As New System.Data.OleDb.OleDbDataAdapter(strSQL, dBConPaps)
Dim DS As New DataSet()
DA.Fill(DS)
Dim rptWKIT As New CrystalDecisions.CrystalReports.Engine.ReportDocument()
rptWKIT.Load(strReportPath)
rptWKIT.SetDataSource(DS.Tables(0))
Dim DiskOpts As CrystalDecisions.Shared.DiskFileDestinationOptions = New CrystalDecisions.Shared.DiskFileDestinationOptions()
rptWKIT.ExportOptions.ExportDestinationType = CrystalDecisions.[Shared].ExportDestinationType.DiskFile
rptWKIT.ExportOptions.ExportFormatType = CrystalDecisions.[Shared].ExportFormatType.Excel
DiskOpts.DiskFileName = "c:\" & strReportName & "_Report.xls"
rptWKIT.ExportOptions.DestinationOptions = DiskOpts
rptWKIT.Export()
Catch x As Exception
MessageBox.Show(x.Message + x.Source + x.StackTrace, "Report Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
2
CrystalReport去死吧
1 MacArthur 2006-11-17 16:30:07
终于发现了一个极其简单的办法 -- 本来也是,Excel也是微软的,微软怎么会不照顾自己一家子呢?
在Project里面add reference -> COM object -> MS Excel 11.0 -- 加了这个之后就可以在VB里名正言顺地引用微软的一堆便民服务... 瞅人这名儿起的,Microsoft.Office.Core -- 一core在手,谁敢阻拦?
这个CrystalReport呢,功能的确比较强大,而且formatting出来也很漂亮。不过呢,出了个连他们自己都解释不了的问题,不能用还不全白搭么... 而且俺只关心数据,不在乎格式 -- 只求您能把数据全部灌到报表里就是大功一件啦...
附上例程,供有心者参考...
Imports Microsoft.Office.Core
......
......
Sub generateCryatalReport(ByVal strReportName As String)
Dim datatable As System.Data.DataTable = dsWKIT.Tables(0)
Dim Application As New Excel.Application()
Application.SheetsInNewWorkbook = 1
Dim wb As Excel.Workbook = Application.Workbooks.Add()
Dim ws As Excel.Worksheet = wb.Worksheets("Sheet1")
ws.Name = strReportName
Dim rowIndex As Integer
Dim colIndex As Integer
Try
' Create the headers on the sheet.
For colIndex = 1 To datatable.Columns.Count
ws.Cells(1, colIndex) = datatable.Columns(colIndex - 1).ColumnName
Next
' Add each row of data to the sheet.
' The sheet cell row is incremented by one because the first row was used for the header.
For rowIndex = 1 To datatable.Rows.Count
For colIndex = 1 To datatable.Columns.Count
ws.Cells(rowIndex + 1, colIndex) = datatable.Rows(rowIndex - 1)(colIndex - 1).ToString()
Next
Next
Catch ex As System.Runtime.InteropServices.COMException
End Try
wb.SaveAs("C:\" & strReportName & ".xls")
wb.Close()
Application.Quit()
End Sub
3
用EXCEL做chart一样方便
1 晓晴夕照 2006-12-04 15:59:00
做出来效果不比CR差。如果有兴趣看看Excel.Series class. 有一个问题是office都是out-of-proc,所以所有的COM object 都要用
Marshal.ReleaseComObject去de-reference 然后再GC, 不然的话一旦出exception,会有一堆dead excel.exe process 你没法kill掉。
还有,如果你只是想export data, 你可以output your data in html format , 然后
Response.ContentType = "application/vnd.ms-excel"
这样client会用EXCEL打开这个HTML。
最后于2006-12-04 16:04:10改,共1次;
4
谢谢,献花 MacArthur 2006-12-04 17:04:53
Marshal.ReleaseComObject去de-reference 然后再GC
这里能否详细解释一下,给个例子?多谢!
5
see the text in red
1 晓晴夕照 2006-12-04 18:39:55
Sub generateCryatalReport(ByVal strReportName As String)
Dim datatable As System.Data.DataTable = dsWKIT.Tables(0)
Dim Application As New Excel.Application()
Application.SheetsInNewWorkbook = 1
Dim wb As Excel.Workbook = Application.Workbooks.Add()
Dim ws As Excel.Worksheet = wb.Worksheets("Sheet1")
ws.Name = strReportName
Dim rowIndex As Integer
Dim colIndex As Integer
Try
...
Catch ex As System.Runtime.InteropServices.COMException
finally
wb.SaveAs("C:\" & strReportName & ".xls")
wb.Close()
Application.Quit()
if not wb is nothing then marshal.releasecomobject(wb)
if not ws is nothing then marshal.releasecomobject(ws)
if not application is nothing then marshal.releasecomobject(application)
wb=nothing:ws=nothing:application=nothing
gc.collect()
End Try
End Sub
3
直接填数据这招狠 lanchong 2006-11-17 21:51:55
CrystalReport的好处是鼠标拉拉就可以用,适合俺这类人用
2
不晓得是啥问题~~
1 并非马甲 2006-11-08 07:29:37
不过给麦帅推荐个程序日志工具:log4net,
网址
链接出处
有了这东东,不用debugger也能调试~~
3
多谢
1 MacArthur 2006-11-08 08:54:57
2
这个问题碰到过,是CR在打包时没有注册的问题!
1 nettman 2006-11-08 05:31:40
我用的VS.Net2003及配套CR软件,解决方法:
在打包文件中,将CR的一个注册包"Regwiz.msm"的"MergeModuleProperties"属性展开,在"License Key"属性中输入CR软件的许可号,然后打包即可!
3
这位兄弟显然是行家 MacArthur 2006-11-08 08:54:38
不过不过,我的的确确是给了License Key了 -- 我的那个License Key是去年得到的... 莫非过期了?
4
如果这个Key在你运行时没有问题,打包时也不会有问题的!
1 nettman 2006-11-08 19:45:43
看看是否还缺其它的安装包!
要部署使用 Crystal Reports for Visual Studio .NET 2003 的程序,需要添加如下合并模块(在解决方案资源管理器中tree的顶端节点右键-->添加):
Crystal_Database_Access2003.msm
Crystal_Database_Access2003_enu.msm
Crystal_Managed2003.msm
Crystal_regwiz2003.msm
VC_User_CRT71_RTL_X86_---.msm
VC_User_STL71_RTL_X86_---.msm
我在中文版下用的VS.Net2003,也许和楼主的VS.Net2002环境有所不同,供参考!
2
这个有趣
1 懒厨 2006-11-07 22:08:39
如果您肯定rptWKIT.Export()这句出错,我就继续猜:
可能CR要求某个特定版本的EXCEL,才能顺利EXPORT,可以对比一下两台机器EXCEL的版本。
反正没有很复杂的数据,不妨试一下CSV FORMAT,EXCEL也能读。
这么看,不关数据库或者MDAC什么事了,否则这几句就会出错。
Dim DA As New System.Data.OleDb.OleDbDataAdapter(strSQL, dBConPaps)
Dim DS As New DataSet()
DA.Fill(DS)
MDAC就是Microsoft Data Access Component,跟数据库有关的。.Net好象要求2.7或以上的版本,不知道有无记错。
2
蹲坑等候,也准备改用vb.net2005
1 lanchong 2006-11-07 20:48:14
2
几个思路
1 懒厨 2006-11-07 18:04:30
我猜有几个可能性
1) 或许是某个CR的DLL漏了
2) dBConPaps 数据库的连接可能有误,指向错误的数据库,错误的登录等等
3) 还可以查看一下用户机器上MDAC的版本,可能太老了。
要是我来DEBUG,我会用最土的办法,加若干个MESSAGE BOX的语句,先判断到底是哪个语句垮了再说。
3
有道理。查了一下,出错的就是这句 MacArthur 2006-11-07 21:51:41
rptWKIT.Export()
问题是再往下就是CrystalDecision的assembly,只能望洋兴叹啦...
您说的几个思路:
1) 或许是某个CR的DLL漏了
这个么,VB.Net + CrystalReport的packaging都是标准化程序,
链接出处照方抓药就行了,应该不存在遗漏的可能...
2) dBConPaps 数据库的连接可能有误,指向错误的数据库,错误的登录等等
老实说,这个是最不拿准的地方... 网上很多高手在研究“Logon Failed”时都坦言,这个错误会发生在应用CrystalReport的任何阶段 -- 甚至有时候什么都不用作,只是简单地Verify Database一下,就行了... BusinessObject自己的网站上对这个错误的解释反倒语焉不详,侧证了他们自己也拿不准到底是何原因...
3) 还可以查看一下用户机器上MDAC的版本,可能太老了。
不好意思,这个得麻烦您给详解一下什么是MDAC...
最后于2006-11-07 23:32:42改,共1次;
4
......MSDN上搜索MDAC chela 2006-11-08 07:45:59
或者google上也行
2
数据库访问权限?
1 丁丁鱼 2006-11-07 17:07:14
查查客户有没有访问数据库的权限。
3
用的是同一套数据库Access MacArthur 2006-11-07 17:22:07
谢谢
【求助】VB.Net高手们进来瞅一瞅啦, CR问题
1 2 共2页