Access 2007 运行时错误

Posted

技术标签:

【中文标题】Access 2007 运行时错误【英文标题】:Access 2007 Runtime Error 【发布时间】:2011-06-16 18:23:15 【问题描述】:

我不确定这是否是发布此问题的正确网站,但它就在这里......

在 Access 2007 中,我在这段 VBA 代码中收到错误“运行时错误'3061':参数太少。预期为 1”:

Private Sub btnCheck_Click()

    Dim rs As Recordset
    Dim db As Database
    Dim id As String
    Dim query As String
    MsgBox ("one")
    Set db = CurrentDb()
    id = Me.UniqueID.Value
    query = "SELECT [Unique_ID] from tblPatients WHERE [Unique_ID] =" & id
    MsgBox (id)
    Set rs = db.OpenRecordset(query) <<<<<HIGHLIGHTED LINE

    If IsNull(rs) Then
        Me.lblCheck.Caption = "NEW"
    Else
        Me.lblCheck.Caption = "EXISTS"
    End If

End Sub

数据源是表,而不是查询。任何帮助将不胜感激!

【问题讨论】:

谷歌搜索 runt-time error 3061 表明当 SQL 查询无效时会发生这种情况。您确定表名和列名正确吗? 我只检查了三次:P 表名:tblPatients 列名:唯一 ID 【参考方案1】:

您的表 tblPatients 中没有名为 Unique_ID 的字段。如果您发布了所有代码,那么这是唯一可能的解释。

编辑:您的评论证实了我的怀疑:

我只检查了三次:P 表名:tblPatients 列名:唯一 ID

您在代码中添加了字段名称中不存在的下划线。您使用方括号是正确的,但正确的代码应该是:

query = "SELECT [Unique ID] from tblPatients WHERE [Unique ID] =" & id

请注意删除的下划线。或者(如果您处于设计的早期阶段,我会说最好),您可以将表中的字段重命名为 Unique_IDUniqueID,这样可以省去很多麻烦。

【讨论】:

【参考方案2】:

有几件事会导致此错误。一个常见的错误是拼写错误的表名和字段名。 我会检查 tblPatients 是否拼写正确,或者如果表链接到服务器连接,则不需要像 dbo.tblPatients 这样的前后缀。 同样,我们假设 id 是一个数字,而不是一个文本字段,如果您没有正确的引号,则会导致错误。 IE。 它会改为阅读 query = "SELECT [Unique_ID] from tblPatients WHERE [Unique_ID] = '" & id & "';"

最后,尝试放置“;”就像我在上面一行中所做的那样。

【讨论】:

基于上面的 cmets。是 [Unique ID] 还是 [Unique_ID]?【参考方案3】:

我建议您在代码中添加一个 Debug.Print 语句,如下所示:

query = "SELECT [Unique_ID] from tblPatients WHERE [Unique_ID] =" & id
Debug.Print "query: " & query

该建议的原因是 Debug.Print 会将您的 SQL 语句打印到即时窗口。 (您可以使用 Ctrl+g 键盘快捷键进入即时窗口。)然后您可以查看您要求 OpenRecordset 使用的完整字符串。通常只是看到那个字符串(而不是试图想象它应该是什么样子)会让你发现问题。如果没有,您可以从即时窗口复制字符串并将其粘贴到新查询的 SQL 视图中...查询设计器可以帮助您查明语法错误...或者在这种情况下,我认为它可能会提醒您哪个查询中的项目数据库引擎无法识别,因此嫌疑人必须是一个参数。如果该步骤仍然无法解决问题,您可以将字符串粘贴到 Stack Overflow 上的问题中。

最后,我认为 IsNull(rs) 可能存在逻辑错误……因为 rs 已被声明为记录集,所以它永远不会为 Null。在以下示例中,SELECT 语句不返回任何记录。 Debug.Print 语句在 OpenRecordset 之前和之后都显示 IsNull(rs): False

Public Sub RecordsetIsNeverNull()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim strSql As String

    strSql = "SELECT * FROM tblFoo WHERE 1 = 2;"
    Set db = CurrentDb

    Debug.Print "IsNull(rs): " & IsNull(rs)
    Set rs = db.OpenRecordset(strSql)
    Debug.Print "IsNull(rs): " & IsNull(rs)

    rs.Close
    Set rs = Nothing
    Set db = Nothing
End Sub

编辑:根据Problem names and reserved words in Access,query 是Access 保留字。我实际上并不认为这是您的问题的原因,但建议您无论如何更改它......也许 strQuery

【讨论】:

以上是关于Access 2007 运行时错误的主要内容,如果未能解决你的问题,请参考以下文章

Access 2010 运行时错误 2185

Access 2010 级联组合框运行时错误 424

Access 2007 中未找到模块错误

MS Access 2007 中的多个联合语句中的嵌套错误

querydefs 运行时错误 3265:在此集合中找不到项目

Access 2007 链接表管理器为一个用户禁用 - 和错误 8458