ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > ADO 连接自身无法释放内存的一种解决方案

ADO 连接自身无法释放内存的一种解决方案

作者:绿色风 分类: 时间:2022-08-18 浏览:103
楼主
ldy
这个查询语句是特意写成这样的,效率很低,不考虑优化的问题。
同样的代码在不同的环境下运行效果差异非常大。

  1. Sub 查询()
  2.     Dim conn As New ADODB.Connection
  3.     Dim SQL As String
  4.     Dim rc As New ADODB.Recordset
  5.     t = Timer
  6.     conn.Open "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=" & ThisWorkbook.FullName
  7.     SQL = "select  a.* from ((select * from [sheet1$]) as a left join (select * from [sheet1$]) as b on a.aa<>b.aa)"
  8.     rc.Open SQL, conn, 1, 3
  9. Debug.Print rc.RecordCount
  10.     rc.Close
  11.     conn.Close
  12.     Set rc = Nothing
  13.     Set conn = Nothing
  14.     MsgBox Timer - t
  15. End Sub

ADO连接自身时有个严重的BUG,多次运行查询语句是会造成内存无法释放,并且会内存占用迭加。
所以有经验的人会尽量避免这种情况,分为两个文件,一个储存数据,一个运行代码。
但很多时候,又不得不进行“ADO 连接自身”这样的操作。那如何解决这个问题就成了一个很头痛的事情。
既然分为两个文件,只要不是“ADO 连接自身”就不会有这个BUG,那么我们可以写几句代码骗一骗EXCEL。

  1. Sub 欺骗式查询()
  2.     Application.ScreenUpdating = False
  3.     Application.DisplayAlerts = False
  4.     ThisWorkbook.ChangeFileAccess xlReadOnly    '转为只读
  5.     查询
  6.     ThisWorkbook.ChangeFileAccess xlReadWrite
  7.     Application.DisplayAlerts = True
  8.     Application.ScreenUpdating = True
  9. End Sub
ThisWorkbook.ChangeFileAccess xlReadOnly   
关键代码就这一句,实现了欺骗效果,
其他两句作用屏蔽 屏幕刷新,避免出现“只读”字样;禁止提示,避免出现询问对话框
看一下两个程序的运行10次的后效果----内存占用相差 10倍。

 


ado.rar
2楼
xyh9999
果然如版主所说,会造成内存无法释放!
学习!向版主致敬!
3楼
xyh9999
后来我又将楼主的成果做了些测试,用您说的方法果然很好,但又有了一个新问题:
       如果data source所指的源文件是加过密的Excel文件,即便已经打开了该文件,用您的方法(即先欺骗成只读文件,用过后再改为可读写文件)就取不到数据或出错,如果不用您的方法(即文件状态一直处于可读写状态)可以取到数据,但内存不能释放,用多了就死机。
     直得庆幸的是对于没有设密码的Excel文件,您的方法十分奏效!请楼主再帮助想想以上问题有没有什么好的解决办法,多谢。
4楼
水星钓鱼
学习下。

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap