【问题标题】:Why does MS Access prompt to enter parameter in update query which already has values?为什么 MS Access 提示在更新查询中输入已经有值的参数?
【发布时间】:2021-07-08 14:34:14
【问题描述】:

我正在创建一个数据库,用户可以在其中更改表中公司的名称。但是,每当我使用更新查询时,它都会要求提供一个已经提供的参数。旧公司名称在变量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 但有趣的是,当我没有在参数对话框中输入值就直接点击 Okay 时,它实际上进行了更改。-_- 很奇怪

【问题讨论】:

  • DoCmd.RunSQL 更改为 CurrentDb().Execute 以禁止显示警告消息。但请记住上面提到的 sql 注入问题。
  • 在屏幕截图中,EREDEON TECHNOLOGIES 似乎是一个表名。对吗?
  • @KostasK。嗯。我试过了,它仍然给出了相同的结果。老实说,我不知道为什么会这样。
  • @marlan yhh Marlan。有先生。

标签: vba forms ms-access error-handling ms-access-2010


【解决方案1】:

尝试将您的 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 Docs,Quotation marks in string expressions
字节,(') and (") - Where and When to use them

【讨论】:

  • 兄弟,这真的有效 KKKKEDDD!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1 你是天才!真的!我不敢相信我仅仅因为一个引号就强调了这么多!你是怎么知道的?
  • 不客气。二十年前我犯了同样的错误,我就知道了这一点。哈哈。请将此问题标记为已回答,并使用我提供的链接进行自我教育。非常感谢您的支持。
  • 谢谢您,先生。我将会。但是我试图重命名表格。但它不起作用。它不会引发任何错误,也不会给出任何东西。我只是不工作。 DoCmd.Rename Me.comp1_box.Value, acTable, new_comp MsgBox ("THE COMPANY HAS SUCCESSFULLY BEEN RENAMED") 其中 Me.comp1_box.Value 是表的新名称,然后 new_comp 是表的旧名称。你能帮帮我吗?
  • 我会试试的。请在此论坛的 Access 和 VBA 标签下发布新问题。使用 StackExchange 指南。提出一个好问题,stackoverflow.com/help/how-to-ask
【解决方案2】:

从根本上说,这个问题是由于在 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 等)绝不应该是表的名称。避免为每个公司维护单独的表格。相反,对所有公司的单个表的数据进行规范化,然后运行 ​​UPDATEWHERE 添加第二个参数。

' 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 调用。下面运行单个 Companies 表的规范化版本:

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

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

VBA (无需关闭操作查询)

DoCmd.OpenQuery "mySavedQuery"

【讨论】:

  • 嘿。谢谢你。我怀疑查询是问题,因为我使用了这种方法,它仍然告诉我输入参数。 Set rs1 = db.OpenRecordset(new_comp, dbOpenDynaset) If rs1.RecordCount = 1 Then rs1.Edit rs1![company_name] = Me.comp1_box.Value rs1.Update ElseIf rs.RecordCount > 1 Then MsgBox ("THE RECORDCOUNT IS MORE THAN ONE") rs1.Edit 直到 rs1.EOF rs1![company_name] = Me.comp1_box.Value rs1.MoveNext Loop rs1.Update End If
  • 当我使用 OpenRecordset 方法并使用 rs.Edit 并选择字段名(Company_Name)时,它仍然给出相同的结果。它告诉我输入参数。然而,每当我在输入参数对话框中点击“确定”而不输入任何内容时,程序都会继续运行并继续完美运行。
  • 您尝试过这里的任何解决方案吗?您还在为每个商店使用单独的表格吗?
  • yhh 我在这里尝试了所有解决方案,但都没有奏效。但我确实找到了解决方案。这里有一个人回答。显然它来自单引号。我只需要将它从双引号更改为单引号
  • 我刚刚发现我的错字。方法应该是CreateQueryDef。这样做,您可以避免 any 围绕文字值引用。我知道这是一个新概念,可能看起来更无关紧要,但这是推荐的路线。并真正考虑对单个商店/公司表进行规范化。查询将更容易编写,数据库存储效率更高。
猜你喜欢
  • 2019-04-02
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
相关资源
最近更新 更多