2012-01-23 59 views
2

私はBDS 2006PostgreSQL私のアプリケーションのために使用しています。
私はテーブル内の主キーの値を見つけるためのクエリで構成される次のコードを持っています。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の内部で正常に動作します。

私はそれがあなたの代わりにPostgreSQLの固有::CASTへの切り替えをしよう可能性が

+1

あなたはsqlをQUERYに設定していますが、QUERY_DMP_RESでOPENを呼び出しています。何か不足していなければ、疲れています( – ComputerSaysNo

+1

PostgreSQLについては何も知らないけど、あなたは ":"を使用します(パラメータを示すのに使用されます)。Query.ParamCheck:= False'を設定してみてください。 – kobik

+0

@DorinDuminica、申し訳ありません。 – Shirish11

答えて

6

1)BDEタグを置くと、BDE + BDE ODBC SQLLink + PgSQL ODBCドライバが使用されることが予想されます。 BDEコンポーネントは、':'をparamマーカーとして、'::'をエスケープシーケンスとして、':'に変換します。 2つの基本的なオプションがあります:

  • セットTQueryがあります。 ParamCheckをFalseに設定し、手でParamsコレクションを記入してください。
  • 2倍ごとに':'、これはパラメータマーカーではありません。したがって、'::::'になります。

2)AnyDACなどの3Dパーティライブラリを使用できます。これは、PgSQL '::'の意味を理解しています。したがって、彼らはパラメータマーカーとして'::'を認識しません。

2

を作業得るのです方法上の任意の意見:

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」など)が含まれている場合は、二重引用符で囲まれていない場合は名前を小文字に変更してください。

これで問題が解決しない場合は、::::regclassを試してみるとよいでしょう。数年前に「::」を2倍にする必要があったDelphiコンポーネントを使用していました。

これが役に立ちます。

関連する問題