MS Access VBA 中的 SQL 指令

Posted

技术标签:

【中文标题】MS Access VBA 中的 SQL 指令【英文标题】:SQL instruction in MS Access VBA 【发布时间】:2019-02-19 07:20:06 【问题描述】:

Chr(34) 的想法给出了

MsgBox1 SELECT * FROM Emp WHERE JobNumber = BFLA
MsgBox2 "SELECT * FROM Emp WHERE JobNumber = BFLA"

它看起来好像应该在 OpenRecordset 中工作,但会为“'SELECT....BFLA'”提供“找不到表”消息

'" & xx & "'" 的想法给出了

MsgBox1 SELECT * FROM Emp WHERE JobNumber = 'BFLA'
MsgBox2 "SELECT * FROM Emp WHERE JobNumber = 'BFLA'"

它还为“'SELECT....'BFLA'”提供“找不到表”消息(BFLA 之前的额外单引号)

有效的原始代码是:

xx = Me![JobID]

Set r1 = db.OpenRecordset("Select * from Emp where EmployeeID = " & Nz(Me![JobID]))

在这段代码中,EmployeeID 是一个数值

最新代码为:

xx = Me![JobNumber] ' the JobNumber from the Combo box which is tested in MsgBox 1 and is correct

xxSQL = "SELECT * FROM Emp WHERE JobNumber = '" & xx & "'"

MsgBox xxSQL, vbOKOnly

xxSQL = Chr(34) & xxSQL & Chr(34)

MsgBox xxSQL, vbOKOnly ' which shows what will go into the OpenRecordset

Set r1 = CurrentDb.OpenRecordset(xxSQL)

很抱歉上次格式不好,希望我已经掌握了消息框的窍门......

克里斯

下面的原始消息

我正在尝试修复一些现有的 Access 代码,因为源应用程序已更改,并且我真的很难将变量放入 SQL 的 Select 语句中。我已经阅读了许多与此类似的已解决问题,并在此 Select 之前、之后和中间尝试了许多 """ 排列,并尝试将其拆分。

xx = Me![JobNumber]
xxSQL = "SELECT * FROM Emp WHERE JobNumber = " & xx
MsgBox xxSQL, vbOKOnly
xxSQL = """ & xxSQL & """
MsgBox xxSQL, vbOKOnly
Set r1 = CurrentDb.OpenRecordset(xxSQL)

JobNumber 现在是一个 4char 字符串,它在组合框中的各种作业中循环,并为每个作业生成一个报告页面。第一个 MsgBox 生成 SELECT * FROM Emp WHERE JobNumber = BFLA(有效代码)

表 Emp 存在并且有一个字段 JobNumber,其中还包含与 Me! 匹配的 4char 字符串(包括 BFLA)。组合框。

第二个 MsgBox 产生“& xxSQL &”,然后是 Access 错误消息 - 找不到输入表或查询“'& xxSQL &”',因为我无法正确获取双引号的数量和位置.

然后生成报告,在组合框列表中循环时重复 2 个 MsgBox,报告很好,只是缺少 Emp 表中的内容。 Emp表除了引入JobNumber外没有任何变化,Set r1后面的代码也没有变化。

我担心这对于比我更有经验的人来说是一个 2 秒的修复,这会很尴尬,但我无法修复它!

谢谢

克里斯

【问题讨论】:

由于您尚未格式化代码,因此您的代码有点难以理解,但我认为您需要在第二段 sql 中使用 ansi 字符。你已经放了 xxSQL = """ & xxSQL & """ 但我认为你想要得到的是 xxSQL = Chr(34) & xxSQL & chr(34)。 或者,如果您尝试将文本作业编号与其他文本进行比较,那么它需要在作业编号周围加上单引号,因此您原来的 "SELECT * FROM Emp WHERE JobNumber = " & xx 需要为 xxSQL = "SELECT * FROM Emp WHERE JobNumber = ' " & xx & " ' " 非常感谢 JennyW 和 Gustav 的回复。它们看起来应该可以工作,但 Access 仍然找不到仍然存在且只有一个字段更改的表:( 如果您使用 sql 创建查询,当您尝试执行它时会出现什么错误? 组合框使用查询传递 JobNumbers 以匹配 Emp 表,并且它为每个 MsgBox 传递正确的 JobNumbers。在提供组合框和 Emp 表的基础表之间运行查询可以正常工作,并提供我在报告中想要的数据....感谢 Jenny 【参考方案1】:

试试这个 - 使用引号作为 xx 是文本:

xx = Me![JobNumber]
xxSQL = "SELECT * FROM Emp WHERE JobNumber = '" & xx & "'"
MsgBox xxSQL, vbOKOnly
Set r1 = CurrentDb.OpenRecordset(xxSQL)

【讨论】:

显然这应该是正确的答案,但为什么不被接受呢?

以上是关于MS Access VBA 中的 SQL 指令的主要内容,如果未能解决你的问题,请参考以下文章

使用 VBA (MS Access) 中的 bigint 字段更新 SQL 表

编辑器中的 ms-access VBA 长 sql 查询字符串行拆分(内联双引号)

如何使用查询或 VBA 和 SQL 更新 MS ACCESS 中的表

MS Access:从 VBA 列出宏

如何使用 VBA 动态 SQL SELECT 语句调用 MS Access 参数查询

MS ACCESS, VBA 将外部 MS Access 表导入 SQL server 表