如何使用 DoCmd.RunSQL

Posted

技术标签:

【中文标题】如何使用 DoCmd.RunSQL【英文标题】:How to use DoCmd.RunSQL 【发布时间】:2020-11-03 16:34:37 【问题描述】:

我确信这是一个简单的解决方法,但我是 VBA 编码的新手。

我正在尝试建立一个具有简单目的的 MS Access 数据库。我的目标是让用户点击“查询_______”按钮,(空白部分是零件号或库存号)然后让他们在框中输入他们的信息并选择飞机平台。我已经弄清楚了那部分,但我在编写实际查询时遇到了麻烦。

我有两个名为“MV-22”和“CH-53E”的表。我有一个主表单,用户可以通过零件号或库存号选择他们想要的查询。一旦他们选择了一个,它就会分别为零件号或库存号打开另一个表格。然后他们输入他们想要查询的信息并从下拉菜单中选择表格(飞机平台)。从那里,我试图让它跨越到他们选择的任何表格,并拉取用户输入。

希望这是有道理的。这是我必须运行查询的代码。它一直在说“编译错误:预期:列表分隔符或)。”就像我说的那样,我确定这是一个简单的修复,我对这一切都是新手.. 感谢您的所有帮助!

Private Sub btnView_Click()

Dim PN As String
Dim TMS As String

PN = [frmSheetsPN]![txtbxPN]![Text]
TMS = [frmSheetsPN]![dropTMS]![Text]

DoCmd.RunSQL ("SELECT * FROM" '&TMS&' "WHERE PartNo LIKE" '&PN&')

End Sub

【问题讨论】:

什么是frmSheetsPN?如果是表单名称,请遵循正确的标识符。看到这个tutorial。 除此之外,由于连字符的特殊字符,这些(“MV-22”和“CH-53E”)不仅不推荐在数据库中使用表名,而且它们可能不应该是单独的表,因为它们表示特定的部分。考虑使用 单个 零件表,其指示列包含“MV-22”、“CH-53E”等值。 您好,所以我已将所有内容合并到一个表中,并附加一列来识别飞机。现在我需要如何调整只有一张表的 SQL 查询?这是我现在拥有的:PN = frmSheetsPN.txtbxPN.Value TMS = frmSheetsPN.dropTMS.Value DoCmd.OpenQuery "SELECT * FROM [" & TMS & "] WHERE PartNo LIKE '%" & PN & "%'" 【参考方案1】:

您的尝试出现了几个问题:

不要将DoCmd.RunSQL 用于返回结果集的查询。此方法保留用于不返回任何数据的操作查询(INSERTUPDATEDELETE)。相反,请使用已保存的查询,然后调用 DoCmd.OpenQuery 将查询打开到屏幕。

如前所述,请避免为每个数据元素使用单独的表格,这些表格的名称带有特殊字符,例如需要括号或反引号转义的连字符。相反,将所有相关数据存储到带有指示符列的单个表中。

对于LIKE 表达式,MS Access GUI (.EXE) 使用星号通配符*,而不是%。但是,您可以将ALIKE% 一起使用。

利用参数化并避免连接值。在 MS Access GUI 中,SQL 查询可以直接引用打开的表单上的表单控件。

避免SELECT * FROM 并控制列的数量和顺序显示。

总而言之,考虑以下设置:

SQL (另存为 Access 保存的查询对象)

SELECT Col1, Col2, Col3, ...
FROM myAircraftsTable
WHERE aircraft_type = Forms![frmSheetsPN]![dropTMS]
  AND PartNo ALIKE '%' & Forms![frmSheetsPN]![txtbxPN] & '%'

VBA (参考上面保存的查询)

Private Sub btnView_Click()
   DoCmd.OpenQuery "mySavedQuery"
End Sub

【讨论】:

以上是关于如何使用 DoCmd.RunSQL的主要内容,如果未能解决你的问题,请参考以下文章

将 DoCmd.RunSQL 用于 INSERT 和 DELETE 时删除确认

DoCmd.RunSQL 中的 VBA 变量

MS Access currentdb.excute 的结果与 Docmd.RunSQL 不同

docmd.runsql ("从 &strValue& 中删除 *")

如何在 Ms Access 2007 中执行 Mysql 查询

无法通过具有长定义的 vba 在 Access 中运行查询