参数实例 recId 对于请求的转换无效。错误码=-4461
Posted
技术标签:
【中文标题】参数实例 recId 对于请求的转换无效。错误码=-4461【英文标题】:Parameter instance recId is invalid for the requested conversion. ERRORCODE=-4461 【发布时间】:2016-07-25 18:49:48 【问题描述】:我正在使用 spring JdbcNamedTemplate 在数据库中插入数据。对于其他操作(例如删除),它可以正常工作,但是在插入时,我从 DB2 收到 -4461 错误。
我已经访问了这些页面: http://www-01.ibm.com/support/docview.wss?uid=swg21622381
Invalid data conversion: Parameter instance 50.0/100 is invalid for the requested conversion. ERRORCODE=-4461, SQLSTATE=42815
但没有帮助。下面是我的代码的 sn-p。
@Override
public void insert(FLIGHT fw)
String sql = "INSERT INTO FLIGHT (FLT,LEG,ORG,DST,BOOKED) VALUES (:flt,:leg,:org,:dst,:booked)";
MapSqlParameterSource namedParameters = new MapSqlParameterSource();
namedParameters.addValue("flt", fw.getFlightNumber());
namedParameters.addValue("leg", fw.getFlightLeg());
namedParameters.addValue("org", fw.getOrg());
namedParameters.addValue("dst", fw.getDst());
namedParameters.addValue("booked", fw.getBooked());
getNamedParameterJdbcTemplate().update(sql, namedParameters);
这也是我的 db2 飞行表模式
CREATE TABLE FLIGHT
(
FLT VARCHAR(4) NOT NULL,
LEG VARCHAR(1) NOT NULL,
ORG VARCHAR(3),
DST VARCHAR(3),
BOOKED DECIMAL(3),
REC_ID INT NOT NULL GENERATED ALWAYS AS IDENTITY(START WITH 1 INCREMENT BY 1),
CONSTRAINT PK_FLIGHT PRIMARY KEY (FLT, LEG)
);
CREATE UNIQUE INDEX UQ268_FLIGHT ON FLIGHT(REC_ID);
这是我遇到的错误
Caused by: com.ibm.db2.jcc.am.SqlSyntaxErrorException: [jcc][1091][10404][4.13.80] Invalid data conversion: Parameter instance REC_ID is invalid for the requested conversion. ERRORCODE=-4461, SQLSTATE=42815
at com.ibm.db2.jcc.am.id.a(id.java:677)
at com.ibm.db2.jcc.am.id.a(id.java:60)
at com.ibm.db2.jcc.am.id.a(id.java:103)
at com.ibm.db2.jcc.am.kc.a(kc.java:774)
at com.ibm.db2.jcc.am.kc.a(kc.java:689)
at com.ibm.db2.jcc.am.go.a(go.java:1583)
at com.ibm.db2.jcc.am.go.setString(go.java:1538)
at org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.setString(WrappedPreparedStatement.java:637)
at org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:421) [spring-jdbc-4.2.5.RELEASE.jar:4.2.5.RELEASE]
at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:235) [spring-jdbc-4.2.5.RELEASE.jar:4.2.5.RELEASE]
at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:150) [spring-jdbc-4.2.5.RELEASE.jar:4.2.5.RELEASE]
at org.springframework.jdbc.core.PreparedStatementCreatorFactory$PreparedStatementCreatorImpl.setValues(PreparedStatementCreatorFactory.java:292) [spring-jdbc-4.2.5.RELEASE.jar:4.2.5.RELEASE]
at org.springframework.jdbc.core.PreparedStatementCreatorFactory$PreparedStatementCreatorImpl.createPreparedStatement(PreparedStatementCreatorFactory.java:244) [spring-jdbc-4.2.5.RELEASE.jar:4.2.5.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:623) [spring-jdbc-4.2.5.RELEASE.jar:4.2.5.RELEASE]
... 200 more
【问题讨论】:
您能否使用数据库工具执行相同的查询(理想情况下,您可以提供您正在使用的相同 JDBC 驱动程序,例如 SQuirreL SQL)? @ArthurNoseda 是的,我可以 根据错误消息,您正在尝试为REC_ID
提供值,这显然是不允许的。显然您的模板生成了错误的语句。
@User45 :你有什么解决办法吗?请问可以分享吗?我也遇到同样的错误:/
【参考方案1】:
你可以在你的代码中试试这个
namedParameters.addValue("flt", fw.getFlightNumber(),Types.VARCHAR);
namedParameters.addValue("leg", fw.getFlightLeg(),Types.VARCHAR);
namedParameters.addValue("org", fw.getOrg(),Types.VARCHAR);
namedParameters.addValue("dst", fw.getDst(),Types.VARCHAR);
namedParameters.addValue("booked", fw.getBooked(),Types.DOUBLE)
这个运行正确,
PreparedStatement ps = connection.prepareStatement(
"INSERT INTO FLIGHT (FLT,LEG,ORG,DST,BOOKED) VALUES (?,?,?,?,?)");
ps.setString(1,"b");
ps.setString(2 ,"b");
ps.setString(3 ,"b");
ps.setString(4 ,"b");
ps.setDouble(5 ,1);
ps.executeUpdate();
ps.close();
user@host:/db2inst1:>db2 "select * from FLIGHT"
FLT LEG ORG DST BOOKED REC_ID
---- --- --- --- ------ -----------
a a a a 1. 1
b b b b 1. 2
2 record(s) selected.
【讨论】:
以上是关于参数实例 recId 对于请求的转换无效。错误码=-4461的主要内容,如果未能解决你的问题,请参考以下文章