关键问题:如何释放Data Report显示后占用的内存!
类似:set mydata=nothing

解决方案 »

  1.   

    没遇见过这样的情况,试试:Private Sub DataReport_QueryClose(Cancel As Integer, CloseMode As Integer)
      Set youRptName = Nothing
    End Sub
      

  2.   

    在所有有关的 事件里面
    Set youRptName = Nothing 
      

  3.   

    测试结果:
    set data environment=nothing  (数据环境)
    set myRpt_money=nothing       (报表)已占用的内存没有减少,继续打开报表内存依旧在递增(XP任务管理器中的PF使用率显示结果)
    看来要从VB清理内存着手了。
      

  4.   

    用了数据环境?这个就不清楚了,DataReport很少使用,用的时候都是用ADO连接,不用DE,而且数据量不是很大,没有发现楼主的问题
      

  5.   

        Set DE = Nothing
        DE.CT.ConnectionString = strCnn
        DE.Commands("gas_money").CommandText = "SELECT * FROM ChargeArre WHERE ........" 
        strDRPName = "普通用户管道燃气抄度报表" & Rep_pay
        drpGas_Money.Sections(2).Controls("LTD_Name").Caption = Bran_ch
        drpGas_Money.Sections(2).Controls("Report_Name").Caption =strDRPName                
        drpGas_Money.Caption = strDRPName
        drpGas_Money.Show监测结果:
    从“drpGas_Money.Sections(2).Controls("LTD_Name").Caption = Bran_ch
    ”开始内存占有率开始升高,到“drpGas_Money.Show”达到本次最高。关闭报表窗口drpGas_Money后内存占有率没降低,如果再次查询预览,内存占有率继续升高,.........多次之后内存溢出!
    郁闷啊,找不到解决办法。
    现在暂时只能让用户每次预览报表的时候都监控内存占有率,快到的时候退出软件再进入。
      

  6.   

    你生成EXE后看看有没这样的情况.......
      

  7.   

    试一下NEW:
     dim rpt as new drpGas_Money
     rpt.show
    关闭报表时释放对象
    Private Sub DataReport_QueryClose(Cancel As Integer, CloseMode As Integer) 
      Set drpGas_Money = Nothing 
    End sub手边没有VB,测试不了
      

  8.   

    这样试试:先
    dim rpt as new drpGas_Money 
    rpt.show 再在datareport_initialize()事件中绑定数据
    最后在DataReport_QueryClose中释放报表对象
      

  9.   

    1、生成EXE问题依旧。(是用户先发现内存溢出的)
    2、
    dim rpt as new drpGas_Money  
    ...................................
    rpt.show  
    Private Sub DataReport_QueryClose(Cancel As Integer, CloseMode As Integer)
    Set drpGas_Money = Nothing
    Set DE = Nothing
    End Sub
      

  10.   

    dim rpt as new drpGas_Money  
    ...................................
    rpt.show 
    set rpt=nothing
     
    在drpGas_Money的Form_Terminate里面把你定义的所有object都=nothing 
    诸如此类
     CRAXDDRT.Application
     CRAXDDRT.report ADODB.Connection
      

  11.   

    报表的数据环境=nothing
    报表窗口drpGas_Money也关闭了内存还是释放不掉。每运行一次增加约50M内存消耗,end后才释放。
      

  12.   

    dim rpt as new drpGas_Money  
    ...................................
    rpt.show 1
    set rpt=nothing 
      

  13.   

    ..................                
    myRpt.Caption = strDRPName
    myRpt.Show 1
    Set myRpt = NothingPrivate Sub DataReport_QueryClose(Cancel As Integer, CloseMode As Integer)
    Set drpGas_Money = Nothing
    DE.CT.Close
    Set DE = Nothing
    End Sub代码修改后测试结果:
    第一次运行预览报表内存PF使用率924MB
    第二次                        973MB
    第三次                        0.99GB关闭程序(VB工程还开着)PF使用率降到826MB毫无进展啊!国庆期间的疑难问题啊!
      

  14.   

    不要用DE,改用ADO吧,测试了一下,用ADO返回10000多条数据,反复打开,内存始终在404-407M之间(同时运行其它程序)。示例代码如下::窗体上:Private Sub cmdRptGroup_Click()
        Dim rpt  As New RptGroup
        '显示分组报表
        rpt.Show
    End Sub报表代码:Option ExplicitDim cn As ADODB.Connection
    Dim rs As ADODB.RecordsetPrivate Sub DataReport_Initialize()
        
        Dim Sql As String, strSql As String
        
    '连接数据库(Access)
       Set cn = New ADODB.Connection
        With cn
            .Provider = "MSDataShape.1"     '一定要这句
            .Open "Data Provider=Microsoft.Jet.OLEDB.4.0 ;" & _
                "Data Source=" & App.Path & "\db1.mdb;" & _
                "Persist Security Info=False"
        End With'设置RptTextBox控件属性
        '分组标头,注意不要设置其DataMember属性
        Me.Sections("Section6").Controls("text1").DataField = "gp"
        '细节标头,其中“miCmd”是分组名称
        Me.Sections("Section1").Controls("text2").DataField = "iName"
        Me.Sections("Section1").Controls("text2").DataMember = "miCmd"
        Me.Sections("Section1").Controls("text3").DataField = "iCode"
        Me.Sections("Section1").Controls("text3").DataMember = "miCmd"
        Me.Sections("Section1").Controls("text4").DataField = "gp"
        'RptGroup.Sections("Section7").Controls("text5").DataMember = "miCmd"
        Me.Sections("Section7").Controls("text5").DataField = "iCode" '分组合计
    '查询表:
        Sql = "SELECT * FROM tb "
         
    '打开查询记录集
        strSql = "SHAPE {" & Sql & " } " & _
            "AS miCmd COMPUTE sum(miCmd.iCode) as iCode,miCmd BY 'gp' "
        Set rs = New ADODB.Recordset
        rs.Open strSql, cn, adOpenStatic, adLockReadOnly    Set Me.DataSource = rs
         
    End SubPrivate Sub DataReport_QueryClose(Cancel As Integer, CloseMode As Integer)
        If rs.State = adStateOpen Then rs.Close
        If cn.State = adStateOpen Then cn.Close
        Set rs = Nothing
        Set cn = Nothing
    End Sub
      

  15.   

    你这个CRAXDDRT.Application 释放了么
    还有这个 CRAXDDRT.Report
      

  16.   

    好象看过MSDN,,一般情况下rpt关闭后会自动释放报表对象。
    我想你的情况可能是二个,一是用了DE,不过这个只是推测,因为没有用过这个,或者是用法上有问题。二是你是在窗体相关事件中设置和绑定报表数据源的,个人认为更恰当的用法应该是放在DataReport_Initialize事件中。个人看法,不一定正确,只供参考。
      

  17.   

    原因找到了,灵感来自“vbman2003 ”的赋值!
    处理办法:原来报表窗体中的DataSource选中的是“DE”,现在去掉,改用赋值的方法:Set myRpt.DataSource = DE。测试结果:内存再也没递增了,而且查询出报表速度奇快!
      

  18.   

    结贴了!严重感谢vbman2003的大力支持,也感谢各位回帖的TX们!