运行时错误 3464:条件表达式中的数据类型不匹配
Posted
技术标签:
【中文标题】运行时错误 3464:条件表达式中的数据类型不匹配【英文标题】:Run Time Error 3464: Data Type Mismatch in criteria expression 【发布时间】:2014-02-26 06:29:54 【问题描述】:我在 Access 2010 中有一个带有两个文本框(用于输入搜索条件的 AIPResultTxt 和用于显示结果的 AIPResultTxt)和一个按钮(搜索按钮)的表单。我在 Access 中也有一个表 Table1。当我单击搜索按钮时,我需要执行一个查询,其条件在表单中的 AIPDTxt 文本框中,将结果存储在记录集中并在文本框 AIPResultTxt 中显示结果。所以我在按钮事件处理程序中输入了以下 VBA 代码。
Private Sub SearchB_Click()
Dim localConnection As ADODB.Connection
Dim query As String
Dim aipid_rs As ADODB.Recordset
Dim db As Database
Set db = CurrentDb
Set localConnection = CurrentProject.AccessConnection
MsgBox "Local Connection successful"
query = "SELECT [AIP Name] FROM [Table1] WHERE [AIP ID]=
" & [Forms]![AIPIDSearchF]![AIPIDTxt] & ""
Set aipid_rs = db.OpenRecordset(query)
Me.AIPResultTxt.Text = aipid_rs![AIP Name]
End Sub
但是当我单击按钮时,我得到本地连接成功消息框,然后在该行中出现运行时错误 3464:
Set aipid_rs= db.OpenRecordset(query)
我已经搜索了类似的错误并进行了更正。但错误不断出现。我的查询有问题吗?无法找出错误。该表是本地表。所以我可以直接在vba的查询中给出[Table1]和字段名。尝试添加分隔符,因为这些字段是文本字段。但这也没有奏效。我也无法给出以下查询:
query = "SELECT [AIP Name] FROM [Table1] WHERE [AIP ID]= " & [Forms]![AIPIDSearchF]!
[AIPIDTxt].Text & ""
这给了我一个运行时错误,指出无法从失去焦点的控件中引用文本。我的标准是文本框中的文本。当我单击按钮时,文本框失去焦点。但是当我搜索错误时,解决方案是删除“.Text”。所以,我结束了上面的查询。不知道线路有什么问题:
Set aipid_rs= db.OpenRecordset(query)
【问题讨论】:
“AIP_ID”列的数据类型是什么? @shahkalpesh:AIP ID 是文本数据类型 您需要在查询值周围加上引号。 @TimWilliams:我给出了这个:query = "SELECT [AIP Name] FROM [ACH] WHERE [AIP ID]= '" + [Forms]![AIPIDSearchF]![AIPIDTxt] + "' " Set aip_rs = db.OpenRecordset(query) Me.AIPResultTxt.SetFocus Me.AIPResultTxt = aipid_rs![AIP Name] 运行时错误 3464 消失了。但我得到运行时错误 91:对象变量或未设置块 可能没有结果? 【参考方案1】:我怀疑您对该代码的问题不止一个。但 Access 只抱怨它发现的第一个问题。再看看这两行...
Dim aipid_rs As ADODB.Recordset
Set aipid_rs = db.OpenRecordset(query)
OpenRecordset
是一个返回 DAO 记录集的 DAO 方法。但是代码尝试将其分配给声明为As ADODB.Recordset
的aipid_rs
。这些记录集类型不兼容。
有一个 ADO 连接对象变量,localConnection,以后什么都不会用到。虽然它不会触发错误,但它只是没有用。实际上,我认为没有任何理由使用 ADO 中的任何东西来完成这项任务。
我建议你试试这个版本的代码...
'Dim localConnection As ADODB.Connection
'Dim query As String ' query is a reserved word
Dim strQuery As String
'Dim aipid_rs As ADODB.Recordset
Dim aipid_rs As DAO.Recordset
Dim db As Database
Set db = CurrentDb
'Set localConnection = CurrentProject.AccessConnection
'MsgBox "Local Connection successful"
' you said [AIP ID] is text type, so include quotes around
' the text box value
strQuery = "SELECT [AIP Name] FROM [Table1] WHERE [AIP ID]= '" & _
[Forms]![AIPIDSearchF]![AIPIDTxt] & "'"
Debug.Print strQuery
DoCmd.RunCommand acCmdDebugWindow
Set aipid_rs = db.OpenRecordset(strQuery)
'Me.AIPResultTxt.Text = aipid_rs![AIP Name] ' .Text property is only
' available when control has focus; it will trigger
' an error at any other time
Me.AIPResultTxt.Value = aipid_rs![AIP Name]
注意Debug.Print strQuery
将在即时窗口中显示SELECT
语句的文本,DoCmd.RunCommand acCmdDebugWindow
打开即时窗口。如果查询仍有问题,请复制语句文本并将其粘贴到新查询的 SQL 视图中进行测试。
最后我很好奇这是否可以用更少的代码为您提供所需的...
Private Sub SearchB_Click()
Me.AIPResultTxt.Value = DLookup("[AIP Name]", "Table1", _
"[AIP ID]='" & Me.AIPIDTxt & "'")
End Sub
【讨论】:
【参考方案2】:您正在使用 ADO 记录集,因此您的开放语法不正确。以下应该对您有用(除非如果控件没有焦点,设置文本可能会出错...)
Dim localConnection As ADODB.Connection
Dim query As String
Dim aipid_rs As ADODB.Recordset
Dim db As Database
Set db = CurrentDb
Set localConnection = CurrentProject.AccessConnection
MsgBox "Local Connection successful"
query = "SELECT [AIP Name] FROM [Table1] WHERE [AIP ID]= '" & [Forms]![AIPIDSearchF]![AIPIDTxt] & "'"
'Set aipid_rs = db.OpenRecordset(query)
Set aipid_rs = New ADODB.Recordset
aipid_rs.Open query, localConnection, adOpenStatic, adLockReadOnly
If Not aipid_rs.EOF Then
Me.AIPResultTxt.Text = aipid_rs![AIP Name]
Else
MsgBox "No records!!"
End If
aipid_rs.Close
Set aipid_rs = Nothing
localConnection.Close
Set localConnection = Nothing
db.Close
Set db = Nothing
【讨论】:
【参考方案3】:好的,所以我一直在寻找一个简单的搜索元素...... 我尝试过使用子表单,也尝试过记录集。所有这些都给了我信息。但不是我想要的紧凑度,谢谢!!!
使用 DOA stuf 很棒,但不适用于我的应用程序。 使用上述:
Me.AIPResultTxt.Value = DLookup("[AIP Name]", "Table1", _
"[AIP ID]='" & Me.AIPIDTxt & "'")
我有我正在寻找的代码的紧凑性...... 谢谢!!! T
【讨论】:
以上是关于运行时错误 3464:条件表达式中的数据类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章
尝试插入 Access 数据库时,条件表达式中的数据类型不匹配错误