【问题标题】:VBA Access: No value given for one or more required parametersVBA 访问:没有为一个或多个必需参数提供值
【发布时间】:2020-07-13 19:23:54
【问题描述】:

我知道,对于这个问题,有很多答案应该是微不足道的,但我没有找到正确的答案。这是我的问题: 我使用以下 select 语句打开一个记录集:

SELECT twinecellar.produktnavn, twinecellar.land, 
 twinecellar.produkttype,  twinecellar.år, 
 twinecellar.antall, twinecellar.poeng, 
 twinecellar.Picture, twinecellar.KR, 
 twinecellar.Poengsum, twinecellar.Sum
FROM twinecellar
WHERE (((twinecellar.land)=forms!fmainview!list13) 
  And ((twinecellar.produkttype)=forms!fmainview!list15))
ORDER BY twinecellar.poeng;

在即时窗口中,我看到列表 13 包含“法国”,列表 15 包含“红色” 当我使用此语句创建一个新查询时,它正在工作,但是,在 rst.Open gsStrQuery 上我收到此错误。 gsStrQuery 包含选择字符串。

代码如下:

Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset

Set conn = CurrentProject.Connection
Set rst = New ADODB.Recordset

rst.CursorType = adOpenDynamic
rst.ActiveConnection = conn
rst.Open gsStrQuery

有人对这个问题有好的想法吗?

【问题讨论】:

  • 当您在即时窗口?gsStrQuery 中写入时,您会得到什么?
  • 与此处相同的原因:stackoverflow.com/a/32118340/3820271 - 但该答案为 DAO 提供了解决方案。您需要设置参数。
  • 请在 VBA 中显示对您的问题至关重要的 gsStrQuery 的分配。
  • 写 ?gsStrQuery,我明白了
  • 写作 ?gsStrQuery,我得到 SELECT twinecellar.produktnavn, twinecellar.land, twinecellar.produkttype, twinecellar.år, twinecellar.antall, twinecellar.poeng, twinecellar.Picture, twinecellar.KR, twinecellar.Poengsum , twinecellar.Sum FROM twinecellar WHERE (((twinecellar.produkttype)=[forms]![fmainview]![list15])) 按 twinecellar.land 订购;

标签: ms-access vba


【解决方案1】:

在构建 SQL 字符串时,将“参数”值连接到字符串中。

gsStrQuery = "SELECT twinecellar.produktnavn, twinecellar.land, " & _
                "twinecellar.produkttype,  twinecellar.år, " & _
                "twinecellar.antall, twinecellar.poeng, " & _
                "twinecellar.Picture, twinecellar.KR, " & _
                "twinecellar.Poengsum, twinecellar.Sum " & _
             "FROM twinecellar " & _
             "WHERE (((twinecellar.land)= '" & forms!fmainview!list13 & "') " & _
                "And ((twinecellar.produkttype)= '" & forms!fmainview!list15 & "')) " & _
             "ORDER BY twinecellar.poeng;"

这样,在您尝试打开查询之前,您的参数值会被硬编码到字符串中。

(另请注意:我在您的参数周围添加了单引号以表示它们是字符串。)

(另请注意:& _ 是 VBA 的续行,因此您的 SQL 字符串可以正确连接。这使您可以拥有一个可读的、缩进很好的 SQL 代码。)

________________________________

还有一种方法可以使用您当前的 gsStrQuery 并将参数值分配给 ADO 记录集。 (但我发现上面的 Replacement 方法在返回查看代码时更容易阅读。唯一的缺点是每次参数更改时都必须重新构建 SQL 字符串。但对于非复杂查询来说,这种开销是最小的。)

不过,如果你真的要使用ADO参数,可以找一个有用的说明here.

希望有帮助:)

【讨论】:

  • Abraxascarab,我印象深刻!关于你的努力和你的提议。我将您的声明发布到我的程序中,并且它有效。太感谢了!现在我将深入研究细节并尝试了解为什么我自己的由 Access 查询工具创建的 select 语句在您的工作时在这种特定情况下不起作用。你一定是个天才!
  • 现在我调查了一下。我不再收到错误消息,但由于单引号将 forms!fmainview!list13 转换为字符串,因此我没有收到任何记录,缺少该字段的内容。你还有什么想法吗?
  • 我的意思是,我不能对参数进行硬编码,因为它们来自我在列表框中所做的选择,例如 list13。我想可以将字段作为参数,而不仅仅是硬编码的字符串?
  • @miwi 硬编码的 SQL 应该是可能的(它适用于我)。但是,由于您已经澄清您正在使用列表框,因此您在列表框“属性表”中“绑定”了哪一列可能存在问题。另外,在运行查询之前,您需要确保两个列表框中的值都是“选定的”。构建后检查 gsStrQuery 的值,以验证您在正确的位置看到“法国”和“红色”。如果你能把gsStrQuery的内容贴到cmets这里,我可以帮你追查问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多