蜻蜓
提示 登录 注册 提示 18403/0 08年12月5日 周五 9点33分 站标
引用(0)请拷贝:
大类:[科技经济] → 版面:[信息技术]
1 2 共2页23 楼主帖分页树展关闭目录
O 【求助】VB.Net高手们进来瞅一瞅啦, CR问题 (MacArthur;字2427 阅1175 花 1 2006-11-07 16:24:22
O CrystalReport去死吧 (MacArthur;字1877 阅571 花 1 2006-11-17 16:30:07
。。O 用EXCEL做chart一样方便 (晓晴夕照;字401 阅581 花 1 2006-12-04 15:59:00
。。。O 谢谢,献花 (MacArthur;字102 阅500 2006-12-04 17:04:53
。。。。O see the text in red (晓晴夕照;字1075 阅520 花 1 2006-12-04 18:39:55
。。O 直接填数据这招狠 (lanchong;字53 阅402 2006-11-17 21:51:55
O 不晓得是啥问题~~ (并非马甲;字117 阅715 花 1 2006-11-08 07:29:37
。。O 多谢 (MacArthur;字0 阅397 花 1 2006-11-08 08:54:57
O 这个问题碰到过,是CR在打包时没有注册的问题! (nettman;字174 阅741 花 1 2006-11-08 05:31:40
。。O 这位兄弟显然是行家 (MacArthur;字90 阅476 2006-11-08 08:54:38
。。。O 如果这个Key在你运行时没有问题,打包时也不会有问题的! (nettman;字427 阅437 花 1 2006-11-08 19:45:43
O 这个有趣 (懒厨;字469 阅681 花 1 2006-11-07 22:08:39
O 蹲坑等候,也准备改用vb.net2005 (lanchong;字0 阅634 花 1 2006-11-07 20:48:14
O 几个思路 (懒厨;字266 阅680 花 1 2006-11-07 18:04:30
。。O 有道理。查了一下,出错的就是这句 (MacArthur;字853 阅644 2006-11-07 21:51:41
。。。O ......MSDN上搜索MDAC (chela;字16 阅347 2006-11-08 07:45:59
O 数据库访问权限? (丁丁鱼;字32 阅653 花 1 2006-11-07 17:07:14
。。O 用的是同一套数据库Access (MacArthur;字4 阅607 2006-11-07 17:22:07
1O【求助】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



2OCrystalReport去死吧 花 1 MacArthur 2006-11-17 16:30:07
终于发现了一个极其简单的办法 -- 本来也是,Excel也是微软的,微软怎么会不照顾自己一家子呢?

在Project里面add reference -> COM object -> MS Excel 11.0 -- 加了这个之后就可以在VB里名正言顺地引用微软的一堆便民服务... 瞅人这名儿起的,Microsoft.Office.Core -- 一core在手,谁敢阻拦? F

这个CrystalReport呢,功能的确比较强大,而且formatting出来也很漂亮。不过呢,出了个连他们自己都解释不了的问题,不能用还不全白搭么... 而且俺只关心数据,不在乎格式 -- 只求您能把数据全部灌到报表里就是大功一件啦... F

附上例程,供有心者参考...

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

3O用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次;
4O谢谢,献花 MacArthur 2006-12-04 17:04:53
Marshal.ReleaseComObject去de-reference 然后再GC

这里能否详细解释一下,给个例子?多谢!
5Osee 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

3O直接填数据这招狠 lanchong 2006-11-17 21:51:55
CrystalReport的好处是鼠标拉拉就可以用,适合俺这类人用
2O不晓得是啥问题~~ 花 1 并非马甲 2006-11-08 07:29:37
不过给麦帅推荐个程序日志工具:log4net,
网址链接出处
有了这东东,不用debugger也能调试~~

3O多谢 花 1 MacArthur 2006-11-08 08:54:57
2O这个问题碰到过,是CR在打包时没有注册的问题! 花 1 nettman 2006-11-08 05:31:40
我用的VS.Net2003及配套CR软件,解决方法:
在打包文件中,将CR的一个注册包"Regwiz.msm"的"MergeModuleProperties"属性展开,在"License Key"属性中输入CR软件的许可号,然后打包即可!
3O这位兄弟显然是行家 MacArthur 2006-11-08 08:54:38
不过不过,我的的确确是给了License Key了 -- 我的那个License Key是去年得到的... 莫非过期了?
4O如果这个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环境有所不同,供参考!
2O这个有趣 花 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或以上的版本,不知道有无记错。
2O蹲坑等候,也准备改用vb.net2005 花 1 lanchong 2006-11-07 20:48:14
2O几个思路 花 1 懒厨 2006-11-07 18:04:30
我猜有几个可能性
1) 或许是某个CR的DLL漏了
2) dBConPaps 数据库的连接可能有误,指向错误的数据库,错误的登录等等
3) 还可以查看一下用户机器上MDAC的版本,可能太老了。

要是我来DEBUG,我会用最土的办法,加若干个MESSAGE BOX的语句,先判断到底是哪个语句垮了再说。
3O有道理。查了一下,出错的就是这句 MacArthur 2006-11-07 21:51:41
rptWKIT.Export()

问题是再往下就是CrystalDecision的assembly,只能望洋兴叹啦... F

您说的几个思路:
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次;
4O......MSDN上搜索MDAC chela 2006-11-08 07:45:59
或者google上也行
2O数据库访问权限? 花 1 丁丁鱼 2006-11-07 17:07:14
查查客户有没有访问数据库的权限。
3O用的是同一套数据库Access MacArthur 2006-11-07 17:22:07
谢谢
【求助】VB.Net高手们进来瞅一瞅啦, CR问题 1 2 共2页

点这里自动刷新◆ 或者 完整聊天


Copyright © cchere 西西河 feed 西西河规 版主规范 帮西西河 帮助(FAQ) 版面介绍 发帖特殊效果 网站地图 关于西西河