Выполнение запроса Delphi BDE PostgreSQL (синтаксическая ошибка)

Я использую 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.

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


person Shirish11    schedule 23.01.2012    source источник
comment
вы устанавливаете sql в QUERY, но вы вызываете OPEN на QUERY_DMP_RES, если я ничего не упускаю, вы устали (:   -  person    schedule 23.01.2012
comment
Я ничего не знаю о PostgreSQL. но, возможно, Query анализирует SQL, когда вы используете: (он используется для указания параметров). попробуйте установить Query.ParamCheck := False   -  person kobik    schedule 23.01.2012
comment
@DorinDuminica, извини, приятель, исправил   -  person Shirish11    schedule 23.01.2012
comment
@ Shirish11 Шириш11 нет проблем, тебе удалось решить проблему?   -  person    schedule 23.01.2012


Ответы (3)


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

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

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

person da-soft    schedule 23.01.2012

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

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

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

person Community    schedule 23.01.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 хочет использовать двоеточие для именованных заполнителей.

person mu is too short    schedule 23.01.2012