在VBA中追加查询(运行时错误3067)

时间:2014-12-30 21:52:15

标签: vba ms-access access-vba ms-access-2010

我将表单上未绑定文本框中的七个值拉入变量。五个变量是字符串类型,两个是double。然后我使用sql将数据附加到表中使用where语句和一个全局变量,该变量包含我从另一个表中使用的外键,因为我不确定如何在browseto中使用openargs ...

Option Compare Database
Private Sub Form_Load()

Dim rowN, rowR, mat, crew, perCom As String
Dim budEst, curBud As Double
End Sub

Private Sub btnCapSubmit_Click()
rowN = Me.CAP_ROW_N
rowR = Me.CAP_ROW_R
mat = Me.CAP_MAT
crew = Me.CAP_CREW
perCom = Me.CAP_PER
budEst = Me.CAP_BUD_EST
curBud = Me.CAP_BUD_CUR

Dim appendIt As String
appendIt = "INSERT INTO CAPITAL " & _
    "([CAPITAL].[CAP_ROW_N], CAPITAL.[CAP_ROW_R], [CAPITAL].[CAP_MAT], [CAPITAL].[CAP_CREW], [CAPITAL].[CAP_PER], [CAPITAL].[CAP_BUD_EST], [CAPITAL].[CAP_BUD_CUR]) " & _
    "VALUES ('" & rowN & "','" & rowR & "','" & mat & "','" & crew & "','" & perCom & "','" & budEst & "','" & curBud & "') WHERE [PRO_ID] = '" & gblFind & "';"
Debug.Print appendIt
DoCmd.RunSQL appendIt
DoCmd.BrowseTo acBrowseToForm, "frmSearchEdit", "NavForm.NavigationSubform", , , acFormEdit
End Sub

访问抱怨错误#3067,"查询输入必须包含至少一个表或查询。"

我不知道我在做什么。 我尝试使用debug.print,但没有立即看到任何东西。然后,我一整天都在使用这个数据库,所以我可以忽略一些非常简单的事情。

P.S。我也尝试用Me.CAP_ROW_N(文本框名称)替换变量,但没有骰子。

2 个答案:

答案 0 :(得分:6)

目前还不清楚你在这里尝试做什么,但是INSERT INTO ... VALUES ()语句没有采用WHERE条款。错误3067是“查询输入必须至少包含一个表或查询”。您可能会看到此错误,因为您已包含WHERE子句但未从表中选择现有值。

请改为尝试:

appendIt = "INSERT INTO CAPITAL " & _
"([CAPITAL].[CAP_ROW_N], CAPITAL.[CAP_ROW_R], [CAPITAL].[CAP_MAT], [CAPITAL].[CAP_CREW], [CAPITAL].[CAP_PER], [CAPITAL].[CAP_BUD_EST], [CAPITAL].[CAP_BUD_CUR]) " & _
"VALUES ('" & rowN & "','" & rowR & "','" & mat & "','" & crew & "','" & perCom & "','" & budEst & "','" & curBud & "');"

此处还有其他几个问题。我将列出它们并让您获得更多指导:

  • 您应该使用.Execute DAO方法而不是DoCmd.RunSQL,因为它允许更好的错误处理,尤其是与dbFailOnError选项一起使用时。
  • 你最终会在未转义的输入上使用单引号遇到麻烦。例如,WHERE LastName = 'O'Malley'
  • 您似乎将所有七个值视为文本,方法是将它们包装在引号中,即使您说两个值是数字(双精度)。数字值不会获得引号。

答案 1 :(得分:3)

不要在字段列表中使用表名限定字段名称。

WHERE子句不属于INSERT ... VALUES语句;摆脱它。

这是我认为你想要的模式的一个较小规模的例子:

appendIt = "INSERT INTO CAPITAL " & _
    "([CAP_ROW_N], [CAP_ROW_R]) " & _
    "VALUES ('" & rowN & "','" & rowR & "');"

但是,我建议您使用参数查询解决此问题。

appendIt = "INSERT INTO CAPITAL " & _
    "(CAP_ROW_N, CAP_ROW_R) " & _
    "VALUES (pCAP_ROW_N, pCAP_ROW_R);"

Dim db As DAO.Database
Dim qdf As DAO.QueryDef

Set db = CurrentDb
Set qdf = db.CreateQueryDef(vbNullString, appendIt)
qdf.Parameters("pCAP_ROW_N") = Me.CAP_ROW_N.Value
qdf.Parameters("pCAP_ROW_R") = Me.CAP_ROW_R.Value
qdf.Execute dbFailOnError

注意我直接使用参数值的文本框值 - 而不是声明变量来保存文本框值。

另请注意参数查询的一个好处是您无需为值的分隔符而烦恼:文本的引号;或#代表日期。