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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:01:21