SQL 字符串中不存在参数标记 XXX

Parameter marker XXX was not present in the SQL String

我正在尝试在 SQL 查询中使用命名参数标记与 Java 和 db2,如下所示:

SELECT ...
FROM mytable c ...
WHERE c.id_field = :myParam

我这样配置连接:

Properties properties = new Properties(); // Create Properties object
properties.put("user", config.getDbUser());         // Set user ID for connection
properties.put("password", bdPassword);     // Set password for connection
properties.put("enableNamedParameterMarkers", 1);
currentConnection = (DB2Connection) DriverManager.getConnection(config.getDbUrl(), properties);

我用查询创建了一个 DB2PreparedStatement 并以这种方式设置值:

DB2PreparedStatement ps = (DB2PreparedStatement) currentConnection.prepareStatement(sqlString);
ps.setJccStringAtName("myParam", "value");

但是我得到下一个错误:

Error: com.ibm.db2.jcc.am.SqlSyntaxErrorException: 
[jcc][10448][12695][4.19.66] Parameter marker 'myParam' was not present in the SQL String. ERRORCODE=-4461, SQLSTATE=42815

我猜不出为什么会这样。

附加数据:

    <dependency>
        <groupId>com.ibm.db2</groupId>
        <artifactId>db2jcc</artifactId>
        <version>4.19.66</version>
    </dependency>

用于 JDBC 和 SQLJ 4.19.66

的 IBM 数据服务器驱动程序

SELECT 来自 SYSIBM.SYSVERSIONS

的版本号
VERSIONNUMBER
-10050900
9070900
10050800
10051000
11010405
11010406
11050700

你的问题没有显示你的真实代码,所以我无法猜测你犯了什么错误或遗漏。

命名参数与 DB2PreparedStatement 配合良好,只要您遵循记录的规则,并且您使用的是当前支持的 Db2-server 版本和当前支持的 type4 版本 db2jcc4.jar driver.

IBM 在文件 TbSel.java.

中提供了一个将命名参数标记与 Type-4 jdbc 连接一起使用的工作示例

示例代码是 here, and on github,在您的 Db2-LUW 服务器 ~$DB2INSTANCE/sqllib/samples/java/jdbc 目录中(如果安装了示例程序)。您可以研究这些以及示例附带的自述文件,然后自己构建它们。

在该示例代码中,IBM 以编程方式启用命名参数标记:(您也可以通过连接字符串属性启用它们 ;enableNamedParameterMarkers=1;

    javax.sql.DataSource ds=null;
    ds=new com.ibm.db2.jcc.DB2SimpleDataSource();
    ...
    ((com.ibm.db2.jcc.DB2BaseDataSource) ds).setEnableNamedParameterMarkers(1);
    ..

您可能想要研究此示例代码以及 IBM 提供的所有其他 jdbc 样本,并让它们正常工作。这是一种学习方式。

尝试:

properties.put("enableNamedParameterMarkers", "1");

而不是:

properties.put("enableNamedParameterMarkers", 1);