【问题标题】:Type Mismatch in VBA SQL expressionVBA SQL 表达式中的类型不匹配
【发布时间】:2020-02-17 15:11:15
【问题描述】:

我已经离开 Access 多年了,但我一直负责一个小型数据库功能。我需要做的是根据下拉结果创建一个查询,然后打开该查询,以便最终用户可以从中复制/粘贴他们想要的内容(或整个结果集)。

我的代码如下所示:

Private Sub btnSubmit_Click()
Dim X As String
Dim Y As String
Dim sSQL As String
Dim MyRs As Recordset

If IsNull(cboReportName.Value) Or IsNull(cboError.Value) Or cboReportName.Value = "" Or cboError.Value = "" Then
  MsgBox "One or more of your selections is empty."
  Exit Sub
End If

X = cboReportName.Column(2)
Y = cboError.Column(1)
sSQL = "Select * from " & X & " where Error = '" & Y & "'"

Set MyRs = CurrentDb.OpenRecordset(sSQL)

End Sub

我在 Set MyRS 行中遇到错误,它告诉我存在类型不匹配。这是否与 Access 如何使用短文本和长文本有关?查询中有 NULL 结果,这会抛出这个吗?任何想法都表示赞赏。

【问题讨论】:

  • 报错时X和Y的内容是什么?您的查询很容易受到 SQL 注入和相关错误的影响,因此这很可能是原因。
  • 这是一个 Intranet Access 应用程序,具有不可编辑的下拉菜单,并且没有机会编辑数据。如果有人想那么努力地弄乱 SQL 注入,他们就会失业。 sSQL 解析为 Select * from qryMED_CALC_IND_Errors where Error = 'MED_CALC_IND_ERROR'。 Error 是保留字吗?也许我需要更改该字段名称。
  • 不,错误不是保留字(您可以仔细检查here)。您能否提供该查询的定义?我在多次查询其他查询时弹出错误,因此虽然该查询可以自行工作,但它仍然可能是原因。而且,只是检查一下,它是一个文本字段,对吗?
  • 我不认为使用单词 Error 作为字段名称是问题,但它是 Access 中的一个特殊单词 allenbrowne.com/AppIssueBadWord.html

标签: sql vba ms-access ms-access-2013


【解决方案1】:

从查询中获得 VBA 类型不匹配错误的可能性很小,因为即使 [Error] 列不是文本,在与字符串值进行比较时它也会简单地返回 false。 (这并不是要贬低 Erik 关于导致错误的多个查询级别的评论......去过那里,处理过这个问题,我相信如果我的回答没有帮助,这仍然可能是一个原因。)

您更有可能引用了 ADO 库(从 VBA 窗口菜单 Tools | References...)并将其优先级置于默认 Access 数据对象库之上。这将导致 Dim MyRs As Recordset 将其解释为 ADO 记录集,但 CurrentDb.OpenRecordset(sSQL) 将返回 DAO.Recordset

将声明更新为

Dim MyRs As DAO.Recordset

或在Tools | 中更改ADO 库的优先级顺序。参考...列表。

【讨论】:

  • 对此进行了测试,这正是发生的情况。如果使用早期绑定,则要明确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多