2008-09-23 136 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說,並重命名血腥專欄。

允許此列名持久存在是構建系統的人中最糟糕的一個例子,它會讓您進入任何項目經理的便便列表。