You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Redshift ODBC驱动v2.0下VBA查询报错及性能下降解决求助

解决Redshift ODBC Driver v2.0下VBA CopyFromRecordset游标错误

问题背景

原基于Redshift ODBC Driver v1.0的ADODB代码可正常将查询结果写入Excel,但切换至v2.0后,执行Sheet1.Range("A1").CopyFromRecordset rs时触发错误:

Run-time error '2147467259 (80004005)' [Redshift][ODBC Driver] Cursor is forward only or non-scrollable

采用QueryTable方案可运行,但性能远低于原ADODB实现,需对原代码做最小修改以规避错误并保留性能。

修改方案

只需在初始化Recordset后添加客户端游标位置设置,并明确指定锁定类型,即可兼容v2.0驱动:

Sub Query_Data_driver_2.0_Fixed ()

    Dim conn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
        
    Set conn = New ADODB.Connection
    conn.ConnectionString = "DRIVER={Amazon Redshift ODBC Driver (x64)}; Server=xx; Database=xx; UID=xx; PWD=xx;"
    conn.Open
    
    strSQL = Sheet1.Shapes("SqlQuery1").OLEFormat.Object.Text
                            
    Set rs = New ADODB.Recordset
    ' 设置游标位置为客户端,将查询结果缓存至本地
    rs.CursorLocation = adUseClient
    ' 明确指定游标类型与锁定类型,适配v2.0驱动限制
    rs.Open strSQL, conn, adOpenStatic, adLockReadOnly

    Sheet1.Range("A1").CopyFromRecordset rs
    
    rs.Close
    conn.Close
End Sub

修改说明

  1. rs.CursorLocation = adUseClient:将游标从服务器端切换至客户端,ADODB会把查询结果缓存到本地内存,规避Redshift v2.0驱动默认的服务器端forward-only游标限制,同时保证CopyFromRecordset可正常读取数据。
  2. 明确指定adLockReadOnly:配合静态游标使用只读锁定,减少驱动端资源开销,维持原方案的高性能。

此修改仅对原代码添加2行关键配置,无需重构逻辑,性能与原v1.0方案基本一致。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 07:03:11