【问题标题】:Insert field name in Delphi SQL parameter instead of string在 Delphi SQL 参数中插入字段名称而不是字符串
【发布时间】:2017-03-13 17:00:44
【问题描述】:

我在delphi中写了一个带有参数的SQL查询

WHERE L1.IdListino = :IdListino

根据用户的一些输入,我希望此参数是表单的字段(tParsIdListinoExport 是字段的名称)或另一个表的列(类似于 WHERE L1.IdListino = fat.IdListino )。

if tParsIdListinoExport.AsString <> '' then
        qSel.ParamByName( 'IdListino' ).AsString := tParsIdListinoExport.AsString
    else
        qSel.ParamByName( 'IdListino' ).Value := 'fat.IdListino';
end;

可悲的是,看起来我无法插入列名作为参数,因为它在列名周围添加了 '',因此将其视为纯文本。 是否可以从参数中删除“”? 非常感谢,

法比奥

【问题讨论】:

  • 参数不是这样工作的。如果您需要对字段名称进行字符串替换,请使用Format
  • @KenWhite 所说的。通常,在 SQL 查询中,参数是 columnsvalues 的占位符,而不是实体名称(如列、表、视图等)的占位符。
  • 正如 Ken 所说……这不是参数的工作方式。如果客户端有要使用的值,那么参数是将其与服务器通信的最佳方式。参数值不会烧录到 SQL 代码中,而是单独传递。如果您希望服务器加入并使用另一个表中的值,那么您必须构建正确的 SQL 语句(不带参数)。

标签: sql delphi parameters


【解决方案1】:

您需要在运行时创建 SQL 指令,例如:

with qSel do
begin
    Close;
    SQL.Clear;
    SQL.Add(addYourSqlHere, without Where clause);
    if Condition1 then
        SQL.Add('where FIELD1 = :PARAM01')
    else
        SQL.Add('where FIELD2 = :PARAM01');
    ParamByName('PARAM01').Value := UserFilter;
end;

【讨论】:

  • 您应该将UserFilter更改为参数以避免sql注入。
【解决方案2】:

你也许可以用 sql 实现你所需要的。细节有点依赖于 RDBMS,但类似于

where (:param1 = 'use_field' and :param2 = OtherTable.field) 或 (:param1 = 'use_param' and Table.field = :param3)

这假设 TableOtherTable 已连接。 它还假设Param1 可以被多次提及 - 并非所有数据库都允许这样做。

【讨论】:

    猜你喜欢
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多