Sql 为什么操作查询在access VBA中不起作用?

Sql 为什么操作查询在access VBA中不起作用?,sql,vba,ms-access,Sql,Vba,Ms Access,我在Access的查询设计中测试了一个更新查询,它可以工作,但是当我尝试在我的模块中使用它时,我得到了错误: SQL语句无效;预期。。。或“更新” 我的问题是: strSql = "UPDATE " & rs.Fields("tableName") & _ " SET " & rs.Fields("foreignKeyName") & " = " & rsContacts.Fields("contactId") & _ " WHERE cont

我在Access的查询设计中测试了一个更新查询,它可以工作,但是当我尝试在我的模块中使用它时,我得到了错误:

SQL语句无效;预期。。。或“更新”

我的问题是:

strSql = "UPDATE " & rs.Fields("tableName") & _ 
" SET " & rs.Fields("foreignKeyName") & " = " & rsContacts.Fields("contactId") & _ 
" WHERE contactId = " & ContactID
rs:具有tableName的表,用于更新表的KeyName rsContacts:当前位于特定联系人上的联系人ID列表。 实际字符串如下所示:

    UPDATE myTable SET ContactId = 5 WHERE contactId = 2
如果查询有效,并且是一个操作查询,为什么会出现此错误

这是我的完整代码:

Public Sub updateChildTablesByVal ContactID尽可能长,ByVal CompanyID尽可能长 作为字符串的Dim strSql 将遥感器作为记录集 Dim rsPending作为记录集 strSql=从联系人中选择联系人ID_ 其中companyId=&companyId&和contactId&contactId 设置rs=CurrentDb.OpenRecordsetstrSql 如果不是rs.BOF和rs.EOF,则 先走一步 strSql=从子表中选择* 设置rsChild=CurrentDb.OpenRecordsetstrSql rsChild.MoveFirst 不使用rsChild.EOF时执行此操作 strSql=UPDATE&rsChild.FieldstableName&SET&rsChild.FieldsforeignKeyName&=&rs.fieldscocontactid&WHERE contactId=&contactId DoCmd.RunSQL strSql 下一个 环 孩子,关上 设置rsChild=Nothing 如果结束
下面是我调试甚至解决这个问题的想法

出于本例的考虑,从Access中创建一个查询-将其命名为UpdateMyTable

然后,实际上从VBA执行这个特定的查询,而不是使用DoCmd

Dim qry As QueryDef

strSql = "UPDATE " & rsChild.Fields("tableName") & " SET " & _
    rsChild.Fields("foreignKeyName") & " = " & _
    rs.Fields("contactId") & " WHERE contactId = " & ContactID

Set qry = CurrentDb.QueryDefs("UpdateMyTable")
qry.SQL = strSql
qry.Execute

这样做的最大优点是,您可以非常轻松地从Access中调试它,以查看呈现的SQL并手动运行它/调整它。

当数据丢失时,这种情况经常发生。你能检查一下是否有单引号吗?你能发布相关的代码,包括执行它的命令和查询中的SQL吗?@JanWalczak,我看不到任何单引号。@Hambone,你说得对。我完全忘了做那件事。我现在更新了这个问题。是否真的有必要创建一个通用的语句?根据数据类型的不同,如果您只是将这样的语句连接起来,它将是一个永无止境的问题源。。。您可以使用参数或使用记录集及其更改数据的功能。请显示执行此命令的代码。。。