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_ID
或 UniqueID
,这样可以省去很多麻烦。
【讨论】:
【参考方案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 运行时错误的主要内容,如果未能解决你的问题,请参考以下文章