Excel VBA ADODB使用DISTINCT仍返回重复结果的疑难求助
Excel加载项SQL查询返回重复数据(仅特定用户出现)
问题详情
开发的多人Excel加载项中,仅一位用户出现SQL查询结果重复的异常:
- SQL语句已使用
DISTINCT关键字,SQL Developer及其他用户执行均无重复 - 该用户的重复数据从第101行开始,仅部分行重复
- 已排查:Oracle版本、Excel版本与其他用户一致;关闭所有其他加载项;改用
For Next循环替代CopyFromRecordset,问题仍存在
相关代码
SQL = "SELECT DISTINCT * FROM " & SCHEMA & ".XR_" & chg & "_OUTBOUND WHERE Header = 1 OR OUTBOUND_BATCH_ID = " & BatchID & " ORDER BY HEADER DESC, CLAIM_NUMBER ASC" rs.Open SQL, cn, adOpenStatic, adLockReadOnly wsMRC.Range("A1").CopyFromRecordset rs
排查与解决建议
- 检查Oracle客户端驱动版本:即使Oracle服务端版本一致,客户端ODBC/OLEDB驱动可能存在版本或位数(32/64位)差异。卸载现有驱动,安装与正常用户完全一致的版本,确保驱动位数和Excel匹配
- 验证Recordset原始数据:在
CopyFromRecordset执行前,添加代码遍历Recordset,用Debug.Print输出每行的关键字段(如CLAIM_NUMBER),确认重复是来自数据库查询结果,还是Excel写入阶段的问题 - 替换
SELECT *为明确字段列表:DISTINCT *依赖所有字段完全匹配才会去重,隐性字段(如LOB类型、高精度数值)在不同客户端解析可能存在差异。手动列出需要的字段,避免通配符带来的不确定性 - 调整Recordset游标参数:当前使用
adOpenStatic游标,尝试改为adOpenForwardOnly;同时将adLockReadOnly替换为adLockOptimistic测试,排除游标驱动的兼容性问题 - 清理Excel缓存与测试环境:让用户新建空白工作簿加载插件,排除现有工作簿的格式缓存问题;同时清理Excel信任中心的缓存数据(路径:Excel选项→信任中心→信任中心设置→受信任位置)
- 排查网络稳定性:用户网络丢包或延迟可能导致Recordset接收异常,建议切换网络环境(如有线/无线、不同内网节点)测试,确认是否为网络问题导致的重复读取
内容的提问来源于stack exchange,提问作者StaticFX
相关产品推荐
相关产品推荐

