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
修改说明
rs.CursorLocation = adUseClient:将游标从服务器端切换至客户端,ADODB会把查询结果缓存到本地内存,规避Redshift v2.0驱动默认的服务器端forward-only游标限制,同时保证CopyFromRecordset可正常读取数据。- 明确指定
adLockReadOnly:配合静态游标使用只读锁定,减少驱动端资源开销,维持原方案的高性能。
此修改仅对原代码添加2行关键配置,无需重构逻辑,性能与原v1.0方案基本一致。
内容的提问来源于stack exchange,提问作者Michi
相关产品推荐
相关产品推荐

