【问题标题】:Noobie problem with using parameters within SQL on Delphi 10.3在 Delphi 10.3 上的 SQL 中使用参数的 Noobie 问题
【发布时间】:2020-01-23 14:53:08
【问题描述】:

我确定我在这里做了一些愚蠢的事情,但这里是 - 原谅我的菜鸟。

我正在尝试使用 Delphi 来尝试编写一个简单的应用程序。我目前正在使用带有 chinook 演示数据库的 SQLlite,其中列出了一些艺术家和专辑。

我已设法将 ComboBox 连接到数据库中的字段以选择艺术家姓名。

然后我想填充艺术家专辑的网格,使用 ComboBox 选择作为该语句中的参数:

select * from albums JOIN artists ON albums.artistid = artists.artistid WHERE artists.name=:selection

如果我在查询对象的参数选项卡中手动填充“选择”,它可以正常工作。

但我需要 :selection 来自 ComboBox,为此我认为我需要执行以下操作:

FDQuery1.ParamByName('selection').AsString := 'ComboBox1.text'

但我一辈子都想不通我会把那段代码放在哪里?我正在阅读的文档说:要将参数标记放入 SQL 文本中,请使用 : 语法。然后使用 Params 集合分配相应的值。

如果我展开查询下的 Params 位,我看不到任何放置它的地方。制作一个新的似乎也不给我这样做的选择。如果我切换到代码视图,我看不到其中包含我的 SQL 查询的部分来手动将其放入其中。也许是一个视图?

抱歉,如果这是一个非常愚蠢的问题。刚开始使用 Delphi!

【问题讨论】:

    标签: sql delphi parameters


    【解决方案1】:

    组合框的 OnSelect 事件是更新查询的一个地方。

    procedure TForm1.ComboBox1Select(Sender: TObject);
    begin
      FDQuery1.ParamByName('selection').AsString := ComboBox1.Text;
      FDQuery1.Open();
    end;
    

    【讨论】:

    • 完美,非常感谢!经过一番摆弄,现在可以工作了。我的下一步将弄清楚为什么它只适用于第一个选择而不是后续选择,但那是明天的一个:)
    • 您需要在更改参数值之前关闭查询。第一次工作,因为查询尚未打开。在例程顶部添加FDQuery1.Close;
    • 是的,明白了。非常感谢你自己和所有的帮助。
    【解决方案2】:

    我通常在表单上有一个程序“BuildQuery”,当表单最初显示 (FormShow)、下拉列表更改 (OnSelect) 或按下“搜索”按钮时,我会调用该程序。

    在该过程中,清除并重新将您的 SQL 添加到查询中,它将自动检测并添加参数。

    然后像你一样做,但不带单引号,然后打开你的查询。

    【讨论】:

    • 非常感谢,这解决了我的第二个问题,它只适用于第一个选择。只是为了帮助我理解为什么它解决了它,如果更改了参数,并且重新打开了查询,为什么还要在那个阶段重新添加 SQL 语句,因为它没有改变?
    • @RichardStevens 您不需要每次都重置 SQL 查询本身。准备好后,它会一直保持准备状态,直到您取消准备或断开数据库连接。只要查询保持准备就绪,您就可以重复使用它,只需根据需要更新参数值。如果这不适合你,那么你需要提供一个minimal reproducible example 来展示你是如何使用它的
    • 我每次都添加 SQL 以允许多个下拉过滤器,如果我将一个下拉列表留空,我会从 SQL 代码中忽略它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 2020-04-28
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    相关资源
    最近更新 更多