delphi "Неправильное использование ключевого слова" в TQuery - PullRequest
4 голосов
/ 23 сентября 2008

Я пытаюсь заполнить TDBGrid результатами следующего TQuery для файла Journal.db:

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

Я пробовал оба Journal."Where" и Journal.[Where] безрезультатно.

Я также пробовал: select Journal.[Where] as "Location" с тем же результатом.

Journal.db - это файл, созданный третьей стороной, и я не могу изменить имена полей.

Проблема в том, что интересующее меня поле называется «где» и, по понятным причинам, вызывает вышеуказанную ошибку. Как я могу ссылаться на это поле, не вызывая взрыва BDE (предположительно)?

Ответы [ 8 ]

4 голосов
/ 23 сентября 2008

Ааа, я снова люблю Delphi ... Я нашел обходной путь. Компонент TQuery имеет свойство Filter: -)
Я пропустил в запросе условие Where =, в то же время сохраняя все остальные условия 'и'.
Я установил для свойства Filter значение "Where = 'RainPump'".
Я установил для свойства Filtered значение True, и жизнь снова наладилась.

Мне все еще интересно, есть ли более умный способ сделать это, используя эту старую технологию, но если это глупо и работает, то это не глупо.

3 голосов
/ 29 декабря 2008

Боюсь, что у кого-то, читающего эту ветку, будет впечатление, что механизм BDE SQL не может обработать запрос:

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

и будет тратить свое время на ненужные обходы вокруг него.

На самом деле эта конструкция работает нормально. Кавычки вокруг «Где» не позволяют BDE интерпретировать его как ключевое слово, как и следовало ожидать.

Я не знаю, что не так в конкретной ситуации Бальдрика или что он пытался в каком порядке. Он описывает проблему как запрос к таблице * .db, но его ошибка SQL больше похожа на то, что вы получите в режиме сквозного просмотра. Или, возможно, он упростил свой код для отправки, тем самым устраняя истинную причину ошибки.

Мои тесты выполнены с: BDE v.5.2 (5.2.0.2) Парадокс для Windows 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

-Аль.

2 голосов
/ 23 сентября 2008

Вы можете вставить результирующий набор в новую таблицу со «значениями» (без указания имен столбцов), где вы задали собственные имена столбцов в новой таблице, а затем сделать выбор из этой таблицы, используя 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;
2 голосов
/ 23 сентября 2008

Перепишите это так, должно работать:

select * from Journal where Journal.[where] = "RainPump"
0 голосов
/ 06 ноября 2011

Хорошо, поэтому именование столбцов после клавиатур плохо в ЛЮБОЙ системе SQL. Вы бы назвали столбец «выбрать» или «считать», или «изменить», или «таблицу», или, может быть, просто для удовольствия «усечь» или «отбросить»? Я надеюсь, что нет.

Даже если вы создаете обходной путь для этого экземпляра, вы создаете минное поле для всех, кто придет за вами. Сделайте то, что сказал mj2008, и переименуйте кровавую колонку.

Разрешение сохранения имени этого столбца является наихудшим примером того, кто строит систему и включил бы вас в список poop для любого менеджера проекта.

0 голосов
/ 23 сентября 2008

В MySQL имена таблиц / столбцов могут быть заключены в `` (угловые одинарные кавычки). Я не уверен, что позволяет BDE, но вы можете попробовать заменить [где] на `где`

0 голосов
/ 23 сентября 2008

Я, я бы переименовал неловкий столбец.

0 голосов
/ 23 сентября 2008
select * from Journal where Journal."where" = "RainPump"
...