VBA ADODB 查询返回 -1

Posted

技术标签:

【中文标题】VBA ADODB 查询返回 -1【英文标题】:VBA ADODB Query Return -1 【发布时间】:2021-04-15 23:50:03 【问题描述】:

我正在尝试使用 VBA 通过 ADODB 连接到 MS Access 数据库。当我运行查询时,我总是得到-1,应该是 1。我使用 *.uld 测试文件检查了连接,发现没问题。 请帮忙。

Private Sub Form_Load()
    Dim sql As String
    Dim recdData As New ADODB.Recordset
    Dim sirb As String
    sirb = "12345"
    sql = "SELECT * FROM sirb_registration WHERE sirb = '" & sirb & "'"
    Set recdData = getResult(sql)
End Sub

Private Function getResult(sql As String) As ADODB.Recordset
    Dim db_conn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Set getResult = Nothing
    
    db_conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.16.0;Data Source=" & CStr(DLookup("db_path", "[DB_Path]")) & ";Persist Security Info=False;"
    db_conn.Open
    rs.Open sql, db_conn, adOpenDynamic, adLockOptimistic
    
    Set getResult = rs

    MsgBox getResult.RecordCount
    
    rs.Close
    db_conn.Close
    Set db_conn = Nothing
    Set rs = Nothing
End Function

下面是我的数据库 sirb_registration 示例图像。

下图是查询和查询结果。

【问题讨论】:

CStr(DLookup("db_path", "[DB_Path]") ) 解析成什么? @WilsMils 我正在尝试从另一个 MS Access 数据库连接到 MS Access 数据库。 DB_Path 是隐藏表,我存储了我要连接的 MS Access 数据库的路径。 CStr(DLookup("db_path", "[DB_Path]") ) 检索路径。这样,如果数据库的位置发生变化,有人可以轻松地更新路径。 @KenWhite RowCount 不是我想知道的。我正在尝试的是,因为我没有得到结果,所以我试图用 RowCount 检查返回。 我看错了你的问题;我因MoveLastMoveFirst 的不当使用而分心。您的 SQL 似乎有语法错误。您是否尝试过不使用代码直接运行它?文字值使用单引号,而不是双引号 - 您的 WHERE 子句无效。 @KenWhite 哎呀……对不起。我正在阅读其他论坛,有些人建议将光标移动到 Last 然后再次 First 。但这没有用。对于双引号语法,我尝试在即时窗口中并将结果字符串粘贴到 MS Access Query builder 中,它可以工作。如果语法错误,请指导我使用更好的语法。 【参考方案1】:

根据微软的文档here,即使对于 adOpenDynamic RecordCount 有时总是-1:

Recordset 对象的游标类型影响是否可以确定记录数。对于只进游标,RecordCount 属性将返回 -1;静态或键集游标的实际计数;以及 -1 或动态游标的实际计数,具体取决于数据源。

很遗憾,我无法弄清楚“取决于数据源”的具体含义。

因此很可能您的测试在这里毫无意义。您是否只是尝试从记录集读取数据?

【讨论】:

谢谢.. 我明白了。 If Not Recordset.EOF Then 为我工作。 如果这对您有帮助,请随时接受。

以上是关于VBA ADODB 查询返回 -1的主要内容,如果未能解决你的问题,请参考以下文章

共享模块VBA之间的adodb连接

Excel VBA 从关闭的工作簿中读取数据,带有 ADODB、动态范围和标题可选

在 VBA 中对断开连接的 ADODB 记录集应用过滤器

尝试通过 ADODB/SQLiteODBC 更改 SQLite 数据库的日志模式时,Excel/VBA 挂起

在 MSAccess 中使用 VBA (ADODB) 将数据从远程 DB 附加到本地表,而不锁定远程 DB 中的记录

在 MS Access (VBA) 中使用 ADODB 将非 ASCII 插入 MySQL 数据库时出现“不正确的字符串值”,但重试有效