【发布时间】: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