主题:【求助】VB.Net高手们进来瞅一瞅啦, CR问题 -- MacArthur
正在学习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
用户既然能在本地机上安装那个msi,自然应该是super user之类的权限。xls文件被生成在C:\根目录下,这个地方应该是所有人都有access吧...
我会让她察看一下这方面的,多谢建议!
不懂 VB,也没用过CrystalReport。不过个人私下怀疑,是不是CrystalReport的库文件没有安装全啊?你可以在用户的机子装一遍CrystalReport,如果还不行把VB也装上。如果装上之后没有问题,那就肯定是缺库文件了,瞎猜的,莫见怪啊
查查客户有没有访问数据库的权限。
花一个先
以前从没用过VB.Net,最近被逼良为娼的说...
按我的理解啊(说错了大家纠正)-- 在Setup Project里面包括了RegWiz.msm的目的就在于:安装的时候可以在用户机的.Net Framework里面添加必须的CrystalReport相关的库文件 -- 而非整个CrystalReport本身。毕竟对于用户来说,他并不需要全本CrystalReport的各种各样功能,他仅仅需要生成报表而已...
不过这个怀疑也不能说没有道理 -- 我现在就有点儿怀疑,这个东东在我的机器上跑得好好的而在用户机上不行,是否因为我的.Net Framework里面有某些东东并没有被完全搬到用户机上?
问题是VB.Net + CrystalReport的Setup Project完全是程式化的东东,有兴趣的可以参考这里:
大家可以看到,这里完全没有个人发挥的余地,也即少加或者漏加了某个文件等等...
除非是说我的机器上最近被自动安装了某个.Net Framework的patch而用户机上没有被安装?
谢谢
我猜有几个可能性
1) 或许是某个CR的DLL漏了
2) dBConPaps 数据库的连接可能有误,指向错误的数据库,错误的登录等等
3) 还可以查看一下用户机器上MDAC的版本,可能太老了。
要是我来DEBUG,我会用最土的办法,加若干个MESSAGE BOX的语句,先判断到底是哪个语句垮了再说。
不过惭愧的是,我帮不上忙。
问题是再往下就是CrystalDecision的assembly,只能望洋兴叹啦...
您说的几个思路:
这个么,VB.Net + CrystalReport的packaging都是标准化程序,外链出处照方抓药就行了,应该不存在遗漏的可能...
老实说,这个是最不拿准的地方... 网上很多高手在研究“Logon Failed”时都坦言,这个错误会发生在应用CrystalReport的任何阶段 -- 甚至有时候什么都不用作,只是简单地Verify Database一下,就行了... BusinessObject自己的网站上对这个错误的解释反倒语焉不详,侧证了他们自己也拿不准到底是何原因...
不好意思,这个得麻烦您给详解一下什么是MDAC...
如果您肯定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或以上的版本,不知道有无记错。
我用的VS.Net2003及配套CR软件,解决方法:
在打包文件中,将CR的一个注册包"Regwiz.msm"的"MergeModuleProperties"属性展开,在"License Key"属性中输入CR软件的许可号,然后打包即可!
不过给麦帅推荐个程序日志工具:log4net,
网址 http://logging.apache.org/log4net/
有了这东东,不用debugger也能调试~~