2008-09-23 135 views
4
“无效使用关键字”

我试图填充以下TQuery的结果对文件Journal.db一个TDBGrid中:德尔福的TQuery

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

我都试过Journal."Where"Journal.[Where]到徒劳无功。

我也试过:select Journal.[Where] as "Location"也有同样的结果。

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

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

+0

这是悖论? – 2011-11-07 16:48:11

回答

2

您可以将结果集插入到一个新表中,其中包含您在新表中给出自己的列名的“values”(指定无列名),然后从该表中进行选择,使用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; 
+0

我喜欢这个想法,并且当我记住TDataSet上的过滤器属性时即将使用它。可能还是会放弃它。 +1 – Baldric 2008-09-23 14:04:48

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

改写它这个样子,应该工作:

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

我,我会重命名尴尬列。

3

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

我仍然想知道是否有更聪明的方法来使用这种旧技术来做到这一点,但如果它很笨,它的工作原理,那么它并不愚蠢。

+0

它可能对本地文件无关紧要,但是如果您正在与sql数据库交谈并且日记表中包含大量数据,那么您将从服务器获取所有这些数据,然后在本地进行过滤。一般来说,这是一件坏事。 – TrevorD 2008-09-23 20:10:47

0

在MySQL中,表/列名可以用``(斜角单引号)括起来。我不确定BDE允许什么,但是你可以尝试用`where'替换[where]

2

恐怕有人读这个帖子会得到BDE SQL引擎无法处理查询的印象:

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

并会浪费他们的时间不必要的绕开它。

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

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

我的测试: BDE v.5.2(5.2.0.2) 悖论的Windows 7节(32B) 德尔福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。

0

好吧,所以在任何SQL系统中,键盘之后的命名列都是坏的。你会列出一列“选择”或“计数”或“改变”或“表”,或者只是为了“截断”或“放下”的乐趣?我希望不会。

即使您建立在这个实例的工作中,您正在创建一个雷区,以便任何人在您之后来到。做什么mj2008说,并重命名血腥专栏。

允许此列名持久存在是构建系统的人中最糟糕的一个例子,它会让您进入任何项目经理的便便列表。