MS Access VBA ADODB Recordset.Open表OK但SQL失败

use*_*232 2 ms-access vba

在此输入图像描述

我有一个MS Access 2007表:

列是DB,Module,CommentID和Comment

我有一个SQL查询,它返回MS Access Query Design中的正确记录.

我在立即窗口中确认了Ms Access Query Design和VBA模块"Module1"中的sql是相同的.

我把这个函数称为如下:

?LookupComment(currentproject.Name,Application.VBE.ActiveCodePane.CodeModule,"1")
Run Code Online (Sandbox Code Playgroud)

随后在函数中的strSQL在立即窗口中确认为

Select * from tblComments where DB='db1.accdb' AND Module='Module1' AND CommentID='1'
Run Code Online (Sandbox Code Playgroud)

如果我用"tblComments"替换"strSQ",函数返回正常.

但我在使用strSQL的rst.open上遇到错误

方法'打开'对象'_Recordset'失败

Public Function LookupComment(theDB, theModule, theCommentID As String) As String

Dim cn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim strSQL As String

Set cn = CurrentProject.Connection
Set rst = New ADODB.Recordset

strSQL = "Select * from tblComments where DB='" & theDB & "' AND " _
    & "Module='" & theModule & "' AND CommentID='" & theCommentID & "'"
rst.Open strSQL, cn, adOpenDynamic, adLockReadOnly

' rst.Open "tblComments", cn, adOpenDynamic, adLockReadOnly

If rst.EOF = False Or rst.BOF = False Then
    rst.MoveFirst
    LookupComment = rst!Comment
End If

Set rst = Nothing
Set cn = Nothing


End Function
Run Code Online (Sandbox Code Playgroud)

思考?

TIA

Han*_*sUp 6

使用此更改测试您的功能:

strSQL = "Select * from tblComments where DB='" & theDB & "' AND " _
    & "[Module]='" & theModule & "' AND CommentID='" & theCommentID & "'"
Run Code Online (Sandbox Code Playgroud)

Module用方括号包围,因为它是一个Jet保留字.请参阅Access中的问题名称和保留字.

具有该未括号的名称的SELECT语句会导致ADO记录集.Open方法失败.正如您所报告的那样,当相同的SELECT语句用于在查询设计器中打开的查询时,它会成功.无论是否Module用括号括起来,Igor的DAO记录集建议对我都有用; 我不明白为什么它失败了.

很难准确预测何时使用保留字,因为db对象名称会咬你.避免完全使用它们更安全.如果您无法避免它们,请将这些名称括在查询的方括号中,以减少混淆数据库引擎的可能性.

您可以下载Allen Browne的免费数据库问题检查器实用程序,并使用它来检查数据库中的保留字.它还会警告您数据库的其他潜在问题.