2012-01-23 4 views
2

Я использую BDS 2006 с PostgreSQL для моего приложения.
У меня есть следующий код, состоящий из запроса на поиск значений основного ключа внутри моей таблицы.Delphi BDE Выполнение запроса 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.

Любые мнения о том, как я могу получить его работы

+1

вы устанавливаете SQL для запроса, но вы не звонишь ОТКРЫТЫЙ на QUERY_DMP_RES, если я не хватает чего-то, что ты устал (:. – ComputerSaysNo

+1

Я знаю ничего о PostgreSQL, но, может быть, Query является разбор SQL когда вы используете «:» (он используется для указания параметров). Попробуйте установить «Query.ParamCheck: = False» – kobik

+0

@DorinDuminica, извините, что он исправил его – Shirish11

ответ

6

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

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

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

2

Вы можете пытаться переключиться на 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 хочет использовать двоеточие для именованных заполнителей.

3

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

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

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

Смежные вопросы