我正在将 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中运行正常。
关于如何使其正常工作的任何观点
答案 0 :(得分:6)
1)如果你把BDE标签,那么我希望你使用BDE + BDE ODBC SQLLink + PgSQL ODBC驱动程序。 BDE组件期望':'
作为参数标记,'::'
作为转义为':'
的转义序列。您有两个基本选项:
TQuery
。ParamCheck
设置为False并用手填写Params
集合; ':'
加倍,这不是参数标记。因此,它将是'::::'
。 2)您可以使用像AnyDAC这样的3d派对库,它们可以理解PgSQL '::'
的含义。因此,他们不会将'::'
识别为参数标记。
答案 1 :(得分:3)
尝试将表名放在双引号之间(如果它的名称包含大写字母,即“MySuperDupleTable”),如果它不在双引号之间,则postgres将其名称更改为小写。
如果这不能解决您的问题,您可能还想尝试::::regclass
我记得几年前,我们使用的是一些需要加倍“::”的Delphi组件。
希望这有帮助。
答案 2 :(得分: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中的某些东西想要使用冒号作为命名占位符。