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 и переименуйте кровавую колонку.
Разрешение на сохранение этого имени столбца является худшим примером того, кто строит систему и может включить вас в список всех руководителей проекта.