2

我将BDS 2006PostgreSQL一起用于我的应用程序。
我有以下代码,其中包含用于在我的表中查找主键值的查询。

 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 中运行良好。

关于我如何让它工作的任何看法

4

3 回答 3

6

1) 如果您放置 BDE 标记,那么我希望您使用 BDE + BDE ODBC SQLLink + PgSQL ODBC 驱动程序。BDE 组件期望':'作为参数标记,并'::'作为转义序列转换为':'. 您有两个基本选择:

  • 设置TQuery。为虚假并手工ParamCheck填写收集;Params
  • 每一个加倍':',这不是参数标记。所以,会的'::::'

2)您可以使用 3d 方库,例如AnyDAC,它们了解 PgSQL 的'::'含义。因此,它们不会被识别'::'为参数标记。

于 2012-01-23T11:32:31.487 回答
3

如果表名包含大写字符,请尝试将表名放在双引号之间,即“MySuperDupleTable”,如果不在双引号之间,postgres 会将其名称更改为小写。

如果这不能解决您的问题,您可能还想尝试一下::::regclass。我记得几年前,我们使用了一些需要加倍“::”的 Delphi 组件。

希望这可以帮助。

于 2012-01-23T09:42:16.407 回答
2

您可以尝试切换到CAST而不是 PostgreSQL-specific ::

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 中的某些东西想要使用冒号作为命名占位符。

于 2012-01-23T09:23:03.230 回答