五千年(敝帚自珍)

主题:【求助】VB.Net高手们进来瞅一瞅啦, CR问题 -- MacArthur

共:💬24 🌺14
分页树展主题 · 全看首页 上页
/ 2
下页 末页
  • 家园 【求助】VB.Net高手们进来瞅一瞅啦, CR问题

    正在学习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

    • 家园 CrystalReport去死吧

      终于发现了一个极其简单的办法 -- 本来也是,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

      • 家园 用EXCEL做chart一样方便

        做出来效果不比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。

        • 家园 谢谢,献花

          Marshal.ReleaseComObject去de-reference 然后再GC

          这里能否详细解释一下,给个例子?多谢!

          • 家园 see the text in red

            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

      • 家园 直接填数据这招狠

        CrystalReport的好处是鼠标拉拉就可以用,适合俺这类人用

    • 家园 不晓得是啥问题~~

      不过给麦帅推荐个程序日志工具:log4net,

      网址 http://logging.apache.org/log4net/

      有了这东东,不用debugger也能调试~~

    • 家园 这个问题碰到过,是CR在打包时没有注册的问题!

      我用的VS.Net2003及配套CR软件,解决方法:

      在打包文件中,将CR的一个注册包"Regwiz.msm"的"MergeModuleProperties"属性展开,在"License Key"属性中输入CR软件的许可号,然后打包即可!

      • 家园 这位兄弟显然是行家

        不过不过,我的的确确是给了License Key了 -- 我的那个License Key是去年得到的... 莫非过期了?

        • 家园 如果这个Key在你运行时没有问题,打包时也不会有问题的!

          看看是否还缺其它的安装包!

          要部署使用 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环境有所不同,供参考!

    • 家园 这个有趣

      如果您肯定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或以上的版本,不知道有无记错。

    • 家园 蹲坑等候,也准备改用vb.net2005
    • 家园 几个思路

      我猜有几个可能性

      1) 或许是某个CR的DLL漏了

      2) dBConPaps 数据库的连接可能有误,指向错误的数据库,错误的登录等等

      3) 还可以查看一下用户机器上MDAC的版本,可能太老了。

      要是我来DEBUG,我会用最土的办法,加若干个MESSAGE BOX的语句,先判断到底是哪个语句垮了再说。

      • 家园 有道理。查了一下,出错的就是这句

        rptWKIT.Export()

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

        您说的几个思路:

        1) 或许是某个CR的DLL漏了

        这个么,VB.Net + CrystalReport的packaging都是标准化程序,外链出处照方抓药就行了,应该不存在遗漏的可能...

        2) dBConPaps 数据库的连接可能有误,指向错误的数据库,错误的登录等等

        老实说,这个是最不拿准的地方... 网上很多高手在研究“Logon Failed”时都坦言,这个错误会发生在应用CrystalReport的任何阶段 -- 甚至有时候什么都不用作,只是简单地Verify Database一下,就行了... BusinessObject自己的网站上对这个错误的解释反倒语焉不详,侧证了他们自己也拿不准到底是何原因...

        3) 还可以查看一下用户机器上MDAC的版本,可能太老了。

        不好意思,这个得麻烦您给详解一下什么是MDAC...

分页树展主题 · 全看首页 上页
/ 2
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河