delphi "Неправильное использование ключевого слова" в TQuery

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

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

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

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

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

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

8 ответов

Решение

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

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

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

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

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

и будет тратить свое время излишне окружая его.

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

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

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

-Аль.

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

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

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

Я бы переименовал неудобную колонку.

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

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

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

select * from Journal where Journal."where" = "RainPump"
Другие вопросы по тегам