Delphi BDE PostgreSQL查询执行(语法错误)

时间:2012-01-23 09:07:29

标签: delphi postgresql syntax-error bde

我正在将 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 个答案:

答案 0 :(得分:6)

1)如果你把BDE标签,那么我希望你使用BDE + BDE ODBC SQLLink + PgSQL ODBC驱动程序。 BDE组件期望':'作为参数标记,'::'作为转义为':'的转义序列。您有两个基本选项:

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