运行时错误 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.Recordsetaipid_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:条件表达式中的数据类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章

OpenRecordSet 的数据类型不匹配错误

条件表达式中的 SQL 数据类型不匹配

尝试插入 Access 数据库时,条件表达式中的数据类型不匹配错误

错误“条件表达式中的数据类型不匹配”

MS 访问错误。 3464,过滤器类型不匹配,如何正确设置过滤器?

条件表达式 Oledb Access 数据库中的数据类型不匹配