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);
我正在尝试在 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
.
示例代码是 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);