【问题标题】:Lazarus Pascal: Parameter pp not foundLazarus Pascal:找不到参数 pp
【发布时间】:2013-11-10 12:39:55
【问题描述】:

我在 Lazarus 上使用带参数的 SQL 查询已经有一段时间了,但我被这个错误难住了。这看起来很基本,但我只是迷路了。

我有以下拉撒路帕斯卡代码:

   strSQL:= 'Select "fCo",  "fcFarmID", "fcFlockCode", ' +
            '"fcWeekEnding","fcAge", ' +
            '(:"pDate" - "fcWeekEnding")/7 as "AgeWeeks" ' +
            'From (select "fCo", "FarmID", "FarmName" from "tblFarms" Where "fCo" = :"pp") as f Left Join "tblFlockCodes" ' +
            'On "FarmID" = "fcFarmID" ';
   dbQuery_FlockCodes.SQL.Text:= strSQL;       
   dbQuery_FlockCodes.Params.ParamByName('pDate').AsDate := dtWeekEndingDate.Date;
   dbQuery_FlockCodes.Params.ParamByName('pp').AsString:= lstCo.Text;

程序在运行最后一行(带参数 pp)时报告运行时错误。错误是:

未找到参数 pp。

我有多个参数的查询,但没有问题。就这一个。我什至尝试重命名参数名称,但我得到了同样的错误。

如果我使用字符串文字代替参数或插入如下连接的字符串,它就可以正常工作。

   strSQL:= 'Select "fCo",  "fcFarmID", "fcFlockCode", ' +
            '"fcWeekEnding","fcAge", ' +
            '(:"pDate" - "fcWeekEnding")/7 as "AgeWeeks" ' +
            'From (select "fCo", "FarmID", "FarmName" from "tblFarms" Where "fCo" = ' + QuotedStr(lstCo.Text) + ' ) as f Left Join "tblFlockCodes" ' +

在上面的最后一个示例中,lstCo 是一个下拉列表框。 在整个代码中,dtWeekEndingDate 是一个日期控件。

也许我正在监督一些事情。任何想法? 谢谢!

【问题讨论】:

  • 如果你试图插入一个表名作为参数,你可能会发现这是不支持的,因为这里给出的原因(它谈论的是一种完全不同的语言,但原则仍然适用):stackoverflow.com/a/15990488/157957
  • (如果不是,为什么要使用双引号,PostgreSQL 只使用它来分隔标识符,例如表名?)
  • @IMSoP 使用 PG,我必须将每个字段和表名用双引号括起来,因为它们包含混合大小写。以类似的方式,我们使用反引号将 mysql 中的字段括起来。这是基本的东西。这不是我第一次这样做。这就是我无法弄清楚的:/
  • 我知道这就是双引号的作用,但是由于我在链接答案中给出的原因,您不能在准备好的语句中使用表名或列名作为参数,因为这没有任何意义。
  • @IMSoP 感谢您的意见...也许我正在监督一些非常简单但重要的事情。但据我所知,我没有使用表名或字段名作为参数。这些参数是通过 Lazarus 设置的(语言无关紧要)。事实上,FIRST 参数 pDate 被接受并且可以工作。只有参数 pp 失败。这就是让我困惑的地方。

标签: sql postgresql lazarus sql-parametrized-query


【解决方案1】:

查询解析器可能会搜索 :pp,因此冒号应该在引号内,如“:pp”,而不是 :“pp”

【讨论】:

  • 或者可能根本不应该有引号(只是:pp而不是":pp":"pp"
  • 在 Postgres 中,如果使用混合大小写,我们必须将每个字段用双引号括起来。此外,我在项目的其他部分也使用了相同的方法。
【解决方案2】:

删除两个参数周围的引号。使用 AsDateAsString 将为您正确格式化它们。

strSQL:= 'Select "fCo",  "fcFarmID", "fcFlockCode", ' +
          '"fcWeekEnding","fcAge", ' +
          '(:pDate - "fcWeekEnding")/7 as "AgeWeeks" ' +
          'From (select "fCo", "FarmID", "FarmName" from "tblFarms" Where "fCo" = :pp) as f Left Join "tblFlockCodes" ' +
          'On "FarmID" = "fcFarmID" ';
dbQuery_FlockCodes.SQL.Text:= strSQL;       
dbQuery_FlockCodes.Params.ParamByName('pDate').AsDate := dtWeekEndingDate.Date;
dbQuery_FlockCodes.Params.ParamByName('pp').AsString:= lstCo.Text;

【讨论】:

  • 事实上 tt 使用引号很麻烦,但我不得不使用它们来保持字段名称的一致性。如果我不将它们括在引号中,则这些字段将被视为小写,并且存在语言报告找不到该字段的情况。我现在正在使用 PG + Pascal,但我已经看到 PG+ C++ 的这些问题。
  • 我没有说要从字段名称中删除它们。我说将它们从parameters 周围移除。当设置AsDateAsString 时,为这些参数设置的值将被正确引用。
  • 也感谢您的意见。奇怪的是,虽然我有同样的错误:“找不到参数 pp”。我开始考虑这是否是 Lazaurs 的内部错误。
猜你喜欢
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 2013-02-14
  • 2016-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多