使用objHTTP发送Tally ODBC导出XML时大数据请求超时错误的解决求助
解决Tally大数据量XML导出HTTP POST超时问题
针对你遇到的小体量XML正常、大数据量超时的问题,结合你的代码objHTTP.Open "POST", URL, False和objHTTP.send (TallyString),以及给出的XML请求内容,分享几个实用的解决思路:
1. 延长HTTP请求的超时时间
默认情况下,MSXML2.XMLHTTP(假设你用的是这个组件)的超时设置比较短,大数据量传输和Tally端处理都需要更多时间。你可以手动设置超时参数,覆盖默认值:
Set objHTTP = CreateObject("MSXML2.XMLHTTP") objHTTP.Open "POST", URL, False ' 设置超时:连接超时、发送超时、接收超时(单位:毫秒,这里设为5分钟) objHTTP.SetTimeouts 0, 0, 300000, 300000 objHTTP.send (TallyString)
参数说明:SetTimeouts(resolveTimeout, connectTimeout, sendTimeout, receiveTimeout),把后两个参数设为较大值(比如300000=5分钟),给Tally足够的时间处理并返回数据。
2. 拆分XML请求的时间范围
你的请求是导出2020-04-01到2021-03-31一整年的Purchase凭证,数据量肯定不小。可以尝试把时间范围拆分成更小的批次(比如按季度、月份),分批导出后再合并数据:
修改后的XML请求片段(以季度为例):
</HEADER> <BODY> <EXPORTDATA> <REQUESTDESC> <STATICVARIABLES> <SVFROMDATE>20200401</SVFROMDATE> <SVTODATE>20200630</SVTODATE> <VOUCHERTYPENAME>Purchase</VOUCHERTYPENAME> <EXPLODEFLAG>No</EXPLODEFLAG> <SVEXPORTFORMAT>$$SysName: XML</SVEXPORTFORMAT> </STATICVARIABLES> <REPORTNAME>Voucher Register</REPORTNAME> </REQUESTDESC> </EXPORTDATA> </BODY> </ENVELOPE>
这样每次请求的数据量大幅减少,不容易触发超时,后续你可以把多个批次的XML数据合并成完整的数据集。
3. 优化Tally的运行性能
Tally在处理大量数据时可能因为内存不足或配置限制导致响应缓慢:
- 打开Tally的配置文件
Tally.ini,调整MaxMemoryUsage参数(比如设为MaxMemoryUsage=2048,单位MB),给Tally分配更多内存; - 导出前关闭Tally中不必要的模块、报表或弹窗,减少系统资源占用;
- 如果是网络版Tally,确认服务器的硬件资源(CPU、内存)足够支撑大数据量导出请求。
4. 压缩XML数据后传输
大数据量XML的体积通常很大,压缩后能显著减少传输时间。你可以用VBScript把XML字符串压缩成gzip格式,再添加请求头告知Tally接收压缩数据:
' 示例:压缩XML字符串为gzip(需要用到ADODB.Stream和Scripting.FileSystemObject) Set objStream = CreateObject("ADODB.Stream") objStream.Open objStream.Type = 2 ' 文本模式 objStream.Charset = "UTF-8" objStream.WriteText TallyString objStream.Position = 0 objStream.Type = 1 ' 二进制模式 objStream.SaveToFile "temp.gz", 2 ' 保存为压缩文件 ' 读取压缩后的二进制数据 objStream.Open objStream.Type = 1 objStream.LoadFromFile "temp.gz" compressedData = objStream.Read ' 发送压缩数据 Set objHTTP = CreateObject("MSXML2.XMLHTTP") objHTTP.Open "POST", URL, False objHTTP.SetRequestHeader "Content-Encoding", "gzip" objHTTP.send compressedData
注意:需要确认你的Tally版本支持接收gzip压缩的请求,否则这个方法不适用。
5. 检查网络与服务器限制
- 确认你的客户端和Tally服务器之间的网络稳定,没有丢包或带宽限制;
- 检查防火墙、代理服务器是否设置了大文件传输的超时限制,必要时调整相关规则;
- 如果是云服务器上的Tally,确认服务商没有限制单请求的大小或超时时间。
内容的提问来源于stack exchange,提问作者user15724951
相关产品推荐
相关产品推荐

