You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ADODB Stream设为Nothing时缓存未清除的VBA问题求助

解决VBA中XMLHTTP下载文件时的缓存问题

首先得明确:你遇到的问题不是因为没正确把变量设为Nothing——哪怕你补上Set HttpReq = Nothing,也解决不了缓存问题。Set ... = Nothing只是释放对象占用的内存,而你碰到的是Microsoft.XMLHTTP默认的HTTP缓存机制在搞鬼,和对象内存释放完全无关。

问题根源

Microsoft.XMLHTTP会默认启用请求缓存:当你重复请求同一个URL时,它会直接返回本地缓存的旧内容,而不会重新向服务器获取更新后的文件。这就是为什么服务器上的文件已经更新,你下载到的还是旧版本。

具体解决方案

这里有几个可靠的办法绕过缓存,获取最新文件:

方法1:添加禁用缓存的HTTP请求头

HttpReq.Open之后、HttpReq.send之前,添加强制服务器返回最新内容的请求头:

Dim sFo As String
Dim oStrm As Object
Dim HttpReq As Object
Dim nwLBUDir As String

sFo = "http://10.38.111.342/Shared_Docs//Docs/Locfile.mdb"
nwLBUDir = Application.CurrentProject.Path

Set HttpReq = CreateObject("microsoft.XMLHTTP")
HttpReq.Open "GET", sFo, False
' 新增:添加禁用缓存的请求头
HttpReq.setRequestHeader "Cache-Control", "no-cache, no-store, must-revalidate"
HttpReq.setRequestHeader "Pragma", "no-cache"
HttpReq.setRequestHeader "Expires", "0"
HttpReq.send

If HttpReq.Status = 200 Then
    Set oStrm = CreateObject("ADODB.Stream")
    oStrm.Open
    oStrm.Type = 1
    oStrm.Write HttpReq.responseBody
    oStrm.SaveToFile nwLBUDir & "\" & "Locfile.mdb", 2
    oStrm.Close
End If

' 别忘了释放所有对象
Set oStrm = Nothing
Set HttpReq = Nothing

方法2:给URL添加随机参数

在URL末尾拼接一个每次都不一样的随机值(比如时间戳),让每次请求的URL看起来是新的,这样缓存就不会生效:

' 修改sFo的定义,添加随机参数
sFo = "http://10.38.111.342/Shared_Docs//Docs/Locfile.mdb?rnd=" & Timer

Timer函数会返回当前时间的秒数,每次运行都不同,服务器会忽略这个无用参数,但会返回最新的文件内容。

方法3:改用WinHttpRequest对象

WinHttpRequest对缓存的控制更直接,你可以直接禁用它的缓存功能:

' 替换创建对象的代码
Set HttpReq = CreateObject("WinHttp.WinHttpRequest.5.1")
HttpReq.Open "GET", sFo, False
' 直接禁用缓存
HttpReq.Option(6) = False ' WinHttpRequestOption_EnableHttpCache
HttpReq.send

补充提醒

你之前的代码里漏了Set HttpReq = Nothing,不过即使补上也解决不了缓存问题。记住:释放对象只是清理内存,影响不到系统或浏览器级的HTTP缓存,核心还是要从HTTP请求本身入手,强制跳过缓存获取最新文件。

内容的提问来源于stack exchange,提问作者KGB

火山引擎 最新活动