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 检查返回。 我看错了你的问题;我因MoveLast
和MoveFirst
的不当使用而分心。您的 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的主要内容,如果未能解决你的问题,请参考以下文章
Excel VBA 从关闭的工作簿中读取数据,带有 ADODB、动态范围和标题可选
尝试通过 ADODB/SQLiteODBC 更改 SQLite 数据库的日志模式时,Excel/VBA 挂起
在 MSAccess 中使用 VBA (ADODB) 将数据从远程 DB 附加到本地表,而不锁定远程 DB 中的记录
在 MS Access (VBA) 中使用 ADODB 将非 ASCII 插入 MySQL 数据库时出现“不正确的字符串值”,但重试有效