使用VBA从PostgreSQL获取数据仅返回10行的问题排查
解决VBA连接PostgreSQL仅返回10条数据的问题
问题根源
PostgreSQL ODBC驱动默认的Fetch Size是10,也就是每次仅从服务器拉取10条数据。你的代码里调用GetRows()时,默认使用的服务器端游标不会一次性加载所有符合LIMIT条件的记录,因此只拿到了前10条。
两种解决方法
方法1:改用客户端游标
将Recordset的CursorLocation设置为客户端模式,这样会一次性把所有满足条件的记录加载到本地内存,GetRows()就能获取全部数据:
Option Explicit ' 建议添加,避免未声明变量引发的问题 Sub main() Dim conn As Object Dim rs As Object Dim Record As Variant Dim strCnx As String ' 创建连接 Set conn = CreateObject("ADODB.Connection") strCnx = "Driver={PostgreSQL Unicode};Server=10.84._._;Port=5432;Database=_;UID=_;PWD=_;" conn.Open strCnx ' 查询数据库 Set rs = CreateObject("ADODB.Recordset") rs.CursorLocation = 3 ' adUseClient的数值常量,无需引用ADODB库 ' 注意:SQL语句里的"id, FROM"多了冗余逗号,需删除 rs.Open "SELECT id FROM dbo.orders ORDER BY tid DESC LIMIT 100", conn Record = rs.GetRows() Worksheets("index").Columns("A").ClearContents ' 测试访问第11条数据(索引从0开始,第11条对应索引10) If UBound(Record, 2) >= 10 Then Cells(1, 1) = Record(0, 10) End If ' 释放资源 rs.Close conn.Close Set rs = Nothing Set conn = Nothing End Sub
方法2:在连接字符串指定Fetch Size
直接在连接字符串中添加Fetch=100(值与LIMIT一致或更大),强制驱动每次拉取指定数量的记录:
strCnx = "Driver={PostgreSQL Unicode};Server=10.84._._;Port=5432;Database=_;UID=_;PWD=_;Fetch=100;"
这种方式无需修改游标类型,也能一次性获取目标数量的数据。
额外注意事项
- 你的SQL语句
SELECT id, FROM存在语法错误,冗余的逗号会导致执行失败,手动测试时可能是输入失误,建议修正为SELECT id FROM。 - 操作完成后务必关闭并释放连接、记录集对象,避免资源泄漏。
内容的提问来源于stack exchange,提问作者Kucherov Egor
相关产品推荐
相关产品推荐

