Выполнение запроса Delphi BDE PostgreSQL (синтаксическая ошибка) - PullRequest
2 голосов
/ 23 января 2012

Я использую BDS 2006 с PostgreSQL для моего приложения.
У меня есть следующий код, состоящий из запроса для поиска значений первичного ключа внутри моей таблицы.

 Query.SQL.Clear;
 Query.SQL.Add('SELECT pg_attribute.attname,format_type(pg_attribute.atttypid, pg_attribute.atttypmod)FROM pg_index, pg_class, pg_attribute WHERE pg_class.oid = '+#39+'tablename'+#39+' ::regclass AND indrelid = pg_class.oid AND pg_attribute.attrelid = pg_class.oid AND pg_attribute.attnum = any(pg_index.indkey)AND indisprimary');
 Query.Open;

Я получаю сообщение об ошибке синтаксиса

 General SQL error.  
 ERROR: syntax error at or near ":";  

Я пытался использовать #58 вместо :, но результаты те же.
Внутри следующий запрос работает нормальномой PostgreSQL.

Любые мнения о том, как мне заставить это работать

Ответы [ 3 ]

6 голосов
/ 23 января 2012

1) Если вы добавите тег BDE, то я ожидаю, что вы использовали драйвер ODBC для BDE + BDE ODBC, SQLLink + PgSQL.Компоненты BDE ожидают ':' как маркер параметра и '::' как escape-последовательность, которая переводится в ':'.У вас есть два основных варианта:

  • установить для TQuery. ParamCheck значение False и заполнить коллекцию Params руками;не маркер параметра.Итак, это будет '::::'.

2) Вы можете использовать сторонние библиотеки, такие как AnyDAC , которые понимают, что означает PgSQL '::'.Таким образом, они не будут распознавать '::' как маркер параметра.

3 голосов
/ 23 января 2012

Попробуйте поместить имя таблицы в двойные кавычки, если имя содержит символы верхнего регистра, т. Е. «MySuperDupleTable», postgres меняет имя на строчные, если оно не заключено в двойные кавычки.

Если это не решит вашу проблему, вы также можете попробовать ::::regclass Я помню, пару лет назад мы использовали некоторые компоненты Delphi, которые требовали удвоения "::".

Надеюсь, это поможет.

2 голосов
/ 23 января 2012

Вы можете попытаться переключиться на CAST вместо специфичного для PostgreSQL :::

Query.SQL.Add('SELECT pg_attribute.attname,format_type(pg_attribute.atttypid, pg_attribute.atttypmod)FROM pg_index, pg_class, pg_attribute WHERE pg_class.oid = CAST('+#39+'tablename'+#39+' AS regclass) AND indrelid = pg_class.oid AND pg_attribute.attrelid = pg_class.oid AND pg_attribute.attnum = any(pg_index.indkey) AND indisprimary');

Возможно, что-то в Delphi хочет использовать двоеточия для именованных заполнителей.

...