1

Firebird を使用するアプリケーションがあります。アプリケーションは、たとえばアイテムをリストするたびに、クエリの長​​いリストを実行します。これらのクエリを取り出して、自分の Java アプリケーションで実行したいと考えています (リストを操作したり、表示したりできるようにするためです)。

問題は...アプリケーションにデバッグオプションがあり、アプリケーションが実行するクエリの種類を確認できることです。元のクエリのいくつかには@兆候がありました。を含むクエリを実行すると@、エラーが発生します。クエリのその部分を取り出すと、すべてが実行され、「期待どおり」に機能します。チャームのように、エラーはありません。

詳細なエラー メッセージ:
エラー コード: -104
トークンが不明です - 行 8、列 32

必要に応じてエスケープ文字を自動的に適用する IntelliJ IDEA を使用します。
元のクエリからのそのような部分:

SELECT  TBL4487."Id" "database.id",
       TBL4487."Code" "database.code",
       TBL4487."Name" "database.name",
       TBL4487."Barcode" "database.barcode",
       TBL4488."Name" "Datagroup",
       TBL4489."Name" "Mey",
       (SELECT FIRST 1   TBL4494."Price" / (CASE
    WHEN (TBL4487."GrossPrices" = @Param4495) THEN 1
    ELSE (TBL4492."Rate" + 100) / 100
END) "productprice.price"
FROM "ProductPrice" TBL4494
WHERE (TBL4494."Product" = TBL4487."Id") AND (TBL4494."PriceCategory" = @Param4497) AND (TBL4494."ValidFrom" <= @Param4498) AND (TBL4494."Currency" = @Param4499) AND (TBL4494."QuantityUnit" = TBL4487."QuantityUnit")
ORDER BY TBL4494."ValidFrom" DESC) "xyz",
       (SELECT FIRST 1   TBL4500."Price" / (CASE
    WHEN (TBL4487."GrossPrices" = @Param4501) THEN 1
    ELSE (TBL4492."Rate" + 100) / 100

問題は、このクエリをどのように実行できるかということです。@シンボルを置き換えるにはどうすればよいですか?

4

1 に答える 1

4

このクエリをJaybirdで直接実行することはできません。これら@ParamXXXXは、パラメータのクエリのプレースホルダーのようです。?ただし、FirebirdもJaybirdもこのタイプのプレースホルダーをサポートしています( DSQLではプレースホルダーとしてのみサポートされています)。

これをJaybirdで実行するには、@ParamXXXXいずれかの各インスタンスをaに置き換えて?、の各プレースホルダーに適切な値を設定するかPreparedStatement、クエリテキスト自体の実際の値に設定する必要があります。

Firebird .NETプロバイダーはスタイルのプレースホルダーをサポートして@....いるため(Firebirdスタイルのプレースホルダーに変換され?ます)、自分で置き換えたくない場合は、代わりにC#/。NETを使用してみてください。

完全開示:私はJaybirdの開発者です

于 2013-01-05T09:46:46.353 に答える