【问题标题】:delphi "Invalid use of keyword" in TQueryTQuery中的delphi“无效使用关键字”
【发布时间】:2010-09-12 08:09:33
【问题描述】:

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

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

Journal."Where"Journal.[Where] 我都试过了,都没有成功。

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

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

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

【问题讨论】:

    标签: delphi bde tquery


    【解决方案1】:

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

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

    【讨论】:

    • 本地文件可能无关紧要,但是如果您正在与 sql 数据库对话并且您的日志表包含大量数据,您将从服务器获取所有数据,然后在本地过滤.通常是一件坏事。
    【解决方案2】:

    恐怕阅读这个帖子的人会觉得 BDE SQL 引擎无法处理查询:

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

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

    事实上,这种结构运行良好。正如您所期望的那样,“Where”周围的引号使 BDE 不会将其解释为关键字。

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

    我的测试使用: BDE v.5.2 (5.2.0.2) Windows v. 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
    

    -阿尔。

    【讨论】:

      【解决方案3】:

      您可以将结果集插入到带有“值”(不指定列名)的新表中,您在新表中已经给出了自己的列名,然后使用 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;
      

      【讨论】:

      • 我喜欢这个想法,当我想起 TDataSet 上的过滤器属性时,我正准备使用它。还是可以试一试。 +1
      【解决方案4】:

      像这样重写它,应该可以工作:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:
            select * from Journal where Journal."where" = "RainPump"
            

            【讨论】:

              【解决方案8】:

              好的,所以在任何 SQL 系统中以键盘命名列都是不好的。您会将列命名为“select”或“count”或“alter”或“table”,或者只是为了它的乐趣而命名为“truncate”或“drop”?我希望不会。

              即使您为 this 实例构建工作环境,您也正在为后面的任何人创建一个雷区。照着mj2008说的做,把血腥的列重命名。

              允许此列名称保留是构建系统的最糟糕的例子,并且会让您进入任何项目经理的便便列表。

              【讨论】:

                猜你喜欢
                • 2018-03-09
                • 2017-07-22
                • 2015-07-15
                • 2015-05-08
                • 2011-08-06
                • 1970-01-01
                • 1970-01-01
                • 2016-04-21
                • 2012-09-23
                相关资源
                最近更新 更多