java - 带@ (at) 符号的 Firebird SQL 查询 - 如何在 JDBC (Jaybird) 中运行查询?

标签 java sql jdbc firebird jaybird

我有一个使用 Firebird 的应用程序。该应用程序执行一长串查询,例如每次你列出你的项目。我想取出这些查询,并在我自己的 Java 应用程序中运行它们(这样我就可以操作列表、显示它等等。)

问题是……应用程序中有一个调试选项,您可以在其中查看应用程序运行的查询类型。一些原始查询带有 @ 符号。如果我运行一个包含 @ 的查询,我会得到一个错误。如果我取出查询的那一部分,一切都会“按预期”运行和工作。没有错误,就像一个魅力。

详细错误信息:
错误代码:-104
token 未知 - 第 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

问题是..我如何运行这个查询?如何替换 @ 符号?

最佳答案

您不能直接使用 Jaybird 运行此查询。这些 @ParamXXXX 似乎是参数查询中的占位符。但是 Firebird 和 Jaybird 都支持这种类型的占位符(它们只支持 ? 作为 DSQL 中的占位符)。

要使用 Jaybird 执行此操作,您需要将 @ParamXXXX 的每个实例替换为 ? 并为 中的每个占位符设置正确的值>PreparedStatement,或使用查询文本本身中的实际值。

Firebird .NET 提供程序确实支持 @.... 样式的占位符(它将它们转换为 Firebird 样式的 ? 占位符),因此您可以尝试使用如果您不想自己替换,请改用 C#/.NET。

全面披露:我是 Jaybird 的开发者

关于java - 带@ (at) 符号的 Firebird SQL 查询 - 如何在 JDBC (Jaybird) 中运行查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14160750/

相关文章:

java - Recyclerview 中的 Admob 横幅广告

mysql - 如何在没有for循环的情况下插入一批空行?

java - PostgreSql 中的事务

java - JDBC Batch 执行速度极慢

java - Oracle JDBC 驱动程序语句缓存与 BoneCP 语句缓存?

java - 从 Seam 电子邮件生成绝对 URL

JavaFX:位置未设置

JavaCSV 未读取任何行

sql - 复杂的存储过程

mysql - 如何复制 SQL 数据库表中的所有行并更改其中一列中的数据?