在TQuery中delphi“无效使用关键字”

时间:2008-09-23 11:50:49

标签: delphi bde tquery

我正在尝试使用以下TQuery的结果对文件Journal.db填充TDBGrid:

select * from Journal
where  Journal.where = "RainPump"

我已经尝试了Journal."Where"Journal.[Where]都无济于事。

我也尝试过:select Journal.[Where] as "Location",结果相同。

Journal.db是由第三方创建的文件,我无法更改字段名称。

问题在于我感兴趣的领域被称为'where',并且可以理解地导致上述错误。如何引用此字段而不会导致BDE(可能)爆炸?

8 个答案:

答案 0 :(得分:4)

啊,我再次爱上了德尔福......我找到了一个解决方法。 TQuery组件具有Filter属性:-)
我在查询中省略了“Where =”where子句,同时仍然保留了所有其他“和”条件 我将Filter属性设置为“Where ='RainPump'” 我将Filtered属性设置为True,生活又好了。

我仍然想知道是否有一种更聪明的方法可以使用这种旧技术来做到这一点,但如果它是愚蠢的并且它有效,那么它并不愚蠢。

答案 1 :(得分:3)

我担心阅读此主题的人会得到BDE SQL引擎无法处理查询的印象:

select * from Journal where Journal."Where" = "RainPump"

并且会浪费他们的时间不必要地绕过它。

事实上这种建筑工作正常。 “Where”周围的引号使BDE无法将其解释为关键字,就像您期望的那样。

我不知道Baldric特殊情况出了什么问题,或者他按什么顺序尝试了什么。他将问题描述为查询* .db表,但他的SQL错误看起来更像是你在passthrough模式下得到的东西。或者,他可能简化了提交的代码,从而消除了错误的真正原因。

我的测试用: BDE v.5.2(5.2.0.2) 适用于Windows的Paradox v.7(32b) Delphi 5.0(5.62)

成功声明的各种版本:

select * from Journal D0 where D0."Where" = "RainPump"
select * from Journal where Journal."Where" = "RainPump"
select * from ":common:Journal" D0 where D0."Where" = "RainPump"
select * from ":common:Journal" where ":common:Journal"."Where" = "RainPump"
select * from :common:Journal where Journal."Where" = "RainPump"
select * from ":common:Journal" D0 where D0."GUMPIK" = 3
select * from ":common:Journal" where ":common:Journal"."GUMPIK" = 3
select * from :common:Journal where Journal."GUMPIK" = 3

看起来正确但失败的语句版本“无效使用关键字”:

select * from ":common:Journal" where :common:Journal."Where" = "RainPump"
select * from :common:Journal where :common:Journal."Where" = "RainPump"
select * from ":common:Journal" where :common:Journal."GUMPIK" = 3
select * from :common:Journal where :common:Journal."GUMPIK" = 3

-Al。

答案 2 :(得分:2)

像这样重写它应该有效:

select * from Journal where Journal.[where] = "RainPump"

答案 3 :(得分:2)

您可以将结果集插入到具有“值”(不指定列名称)的新表中,其中您在新表中给出了自己的列名,然后从该表中执行选择,使用TQuery,如下所示:

Query1.sql.clear;
query1,sql.add('Insert into newtable values (select * from Journal);');
query1.sql.add('Select * from newtable where newcolumn = "Rainpump";');
query1.open;

答案 4 :(得分:0)

select * from Journal where Journal."where" = "RainPump"

答案 5 :(得分:0)

我,我会重命名这个尴尬的专栏。

答案 6 :(得分:0)

在MySQL中,表/列名称可以用``(带角度的单引号)括起来。我不确定BDE允许什么,但你可以尝试用`where`

替换[where]

答案 7 :(得分:0)

好的,所以在任何SQL系统中键盘之后的命名列都很糟糕。您是否会将列命名为“选择”或“计数”或“更改”或“表格”,或者只是为了它的乐趣“截断”或“删除”?我希望不会。

即使你为这个实例进行了解决,你也可以为你之后的任何人创建一个雷区。做什么mj2008说并重命名血腥列。

允许此列名称持久存在是建立系统的最糟糕的例子,并且会让您进入任何项目经理的大便列表。