2

在此处输入图像描述

我有一个 MS Access 2007 表:

列是 DB、Module、CommentID 和 Comment

我有一个 SQL 查询,它在 MS Access 查询设计中返回正确的记录。

我已经在即时窗口中确认,在 Ms Access Query Design 和 VBA 模块“Module1”中的 sql 是相同的。

我调用函数如下:

?LookupComment(currentproject.Name,Application.VBE.ActiveCodePane.CodeModule,"1")

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

Select * from tblComments where DB='db1.accdb' AND Module='Module1' AND CommentID='1'

如果我用“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

想法?

TIA

4

3 回答 3

6

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

strSQL = "Select * from tblComments where DB='" & theDB & "' AND " _
    & "[Module]='" & theModule & "' AND CommentID='" & theCommentID & "'"

Module用方括号括起来,因为它是 Jet 保留字。请参阅Access 中的问题名称和保留字

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

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

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

于 2012-04-22T06:38:28.147 回答
2

改用 DAO 记录集:

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

Dim rst As Recordset
Dim strSQL As String

strSQL = "Select * from tblComments where DB='" & theDB & "' AND " _
    & "Module='" & theModule & "' AND CommentID='" & theCommentID & "'"

Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)

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

Set rst = Nothing

End Function

在旁注中,您确定需要 CommentID 作为字符串/文本类型吗?

于 2012-04-22T04:38:42.760 回答
0

我认为您在查询末尾缺少分号。

于 2012-04-22T02:45:17.433 回答