微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 MS Access 会提示在已经有值的更新查询中输入参数?

如何解决为什么 MS Access 会提示在已经有值的更新查询中输入参数?

我正在制作一个数据库用户可以在其中更改表中公司的名称。但是,每当我使用更新查询时,它都会要求一个已经提供的参数。旧公司名称在变量 new_comp 中,然后新公司名称Me.comp1_Box.Value 中。

有趣的是,每当我点击确定并在“输入参数”设置中不输入任何内容时,查询运行得非常好

Dim record_changer As String
         
record_changer = "UPDATE " & "[" & new_comp & "]" & " SET " & "[" & new_comp & "]" & ".Company_Name =" & """" & Me.comp1_Box.Value & """" & ";"
     
MsgBox (record_changer)
             
DoCmd.Runsql (record_changer)

这是record_changer的最终值。 更新 [EREDEON TECHNOLOGIES] SET [EREDEON TECHNOLOGIES].Company_Name="EREDEON TECH";

这是代码运行时的样子。

谁能帮帮我? 我真的迷路了。旧公司名称名称是 EREDEON TECHNOLOGIES,新名称是 EREDEON TECH 但是有趣的是,当我在没有在参数对话框中输入值的情况下直接点击 OK 时,它实际上进行了更改。-_- 很奇怪

解决方法

从根本上说,这个问题是由于在 VBA 中使用了双引号,它本身在 Access SQL 中工作,但不能通过 VBA 使用 DoCmd.RunSQL。您可以使用单引号将公司名称值括起来。

但是,首先要避免将 VBA 文字与带引号的 SQL 查询连接起来。相反,使用 MS Access 中可用的参数化行业最佳实践,使用 VBA 中的 QueryDefs 和 SQL 中的 PARAMETERS 子句:

Dim record_changer As String
Dim qdef As QueryDef

sql = "PARAMETERS new_name_param TEXT; " _
       & "UPDATE [" & new_comp & "] " _
       & "SET Company_Name = new_name_param;"

' SET UP QUERYDEF
Set qdef = CurrentDb.CreateQueryDef("",sql)

' BIND PARAMS
qdef!new_name_param = Me.comp1_box.Value

' RUN ACTION
qdef.Execute

' RELEASE RESOURCE
Set qdef = Nothing

尽管如此,在查询中需要连接表名 new_comp 是有问题的数据库设计。专有名称(EREDEON TECHNOLOGIES、GAME DISCOUNT STORE、SHOPRITE 等)永远不应是表的名称。避免为每个公司维护一个单独的表。相反,将所有公司的单个表的数据标准化,然后运行 ​​UPDATE 并添加第二个参数 WHERE

' PREPARED STATEMENT,NO VARIABLE CONCATENATION
sql = "PARAMETERS new_name_param TEXT,old_name_param TEXT; " _
      & " UPDATE Companies " _
      & " SET Company_Name = new_name_param" _
      & " WHERE Company_Name = old_name_param;"

Set qdef = CurrentDb.CreateQueryDef("",sql)

qdef!new_name_param = Me.comp1_box.Value
qdef!old_name_param = new_comp

qdef.Execute

事实上,由于上​​面的SQL现在已经从VBA中分离出来了,所以将没有VBA标点符号(&"_)的查询保存为一个单独的对象并在QueryDefs中调用按名称:

Set qdef = CurrentDb.QueryDefs("mySavedQuery")

qdef!new_name_param = Me.comp1_box.Value
qdef!old_name_param = new_comp

qdef.Execute

更好的是,如果您的参数来自打开表单上的控件,请将它们直接包含在查询中以进行单行 VBA 调用。下面运行单个公司表的规范化版本:

SQL (另存为查询对象,将名称调整为实际值)

UPDATE Companies
SET Company_Name = Forms!myForm!comp1_box 
WHERE Company_Name = Forms!myForm!new_comp

VBA (无需关闭操作查询)

DoCmd.OpenQuery "mySavedQuery"
,

尝试将您的 SQL 字符串更改为以下内容。请注意 Me.comp1_box.Value 周围的单引号变化。

record_changer = "UPDATE " & "[" & new_comp & "]" & " SET " & "[" & new_comp & "]" & ".Company_Name ='" & Me.comp1_box.Value & "';"

滥用引号是参数值提示的最常见原因。如果这不起作用,请使用本文逐步解决所有其他常见原因,Why does Access want me to enter a parameter value?

您还可以参考以下文章:

MS 文档,Quotation marks in string expressions
字节,(') and (") - Where and When to use them

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。