我试图调用一个存储过程在SQL表中创建一个项。当代码运行时,存储过程被执行并且项目被创建,但是会抛出此错误。表中存储的值是正确的,并且生成的键也是正确的。
以下是我的创建函数,在这里我创建参数映射:
public int create(Job job) throws DataAccessException, NullPointerException {
Assert.notNull(job,"Job must not be null.");
Assert.notNull(job.getSite(),"Site must not be null.");
KeyHolder keyHolder = new GeneratedKeyHolder();
final String columnNames[] = {"id"};
MapSqlParameterSource params = params("intSiteId",job.getSite().getId())
.addValue("dtmStart", job.getStartDate() == null ? null : dateTimeString(job.getStartDate()))
.addValue("dtmEnd", job.getEndDate() == null ? null : dateTimeString(job.getEndDate()))
.addValue("intManualFl",job.isManual());
getTemplate().update(getSql("create"), params, keyHolder, columnNames);
return keyHolder.getKey().intValue();
}
更新函数位于NamedParameterJdbcTemplate类中。
@Override
public int update(
String sql, SqlParameterSource paramSource, KeyHolder generatedKeyHolder, String[] keyColumnNames)
throws DataAccessException {
ParsedSql parsedSql = getParsedSql(sql);
String sqlToUse = NamedParameterUtils.substituteNamedParameters(parsedSql, paramSource);
Object[] params = NamedParameterUtils.buildValueArray(parsedSql, paramSource, null);
List<SqlParameter> declaredParameters = NamedParameterUtils.buildSqlParameterList(parsedSql, paramSource);
PreparedStatementCreatorFactory pscf = new PreparedStatementCreatorFactory(sqlToUse, declaredParameters);
if (keyColumnNames != null) {
pscf.setGeneratedKeysColumnNames(keyColumnNames);
}
else {
pscf.setReturnGeneratedKeys(true);
}
return getJdbcOperations().update(pscf.newPreparedStatementCreator(params), generatedKeyHolder);
}
异常:
2015年5月28日上午11:17:02,org.apache.catalina.core.StandardWrapperValve调用servlet [dispatcher]时,路径为空。抛出异常[请求处理失败;嵌套异常为org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; SQL [{call usp_createNewTrans(?,?,?,?)}]; SQL状态为[null];错误代码为[0];更新操作产生一个结果集;嵌套异常为com.microsoft.sqlserver.jdbc.SQLServerException: 更新操作产生一个结果集。],并提供了根本原因。编辑:
我修改了我的代码如下(请见下文),现在它可以正常工作... 我向restController返回0,最初显示的id为0... 但是在刷新页面后会正确解析到正确的id,但我觉得这不是完美的解决方法。
public int create(Job job) throws DataAccessException, NullPointerException {
Assert.notNull(job,"Job must not be null.");
Assert.notNull(job.getSite(),"Site must not be null.");
MapSqlParameterSource params = params("intSiteId",job.getSite().getId())
.addValue("dtmStart", job.getStartDate() == null ? null : dateTimeString(job.getStartDate()))
.addValue("dtmEnd", job.getEndDate() == null ? null : dateTimeString(job.getEndDate()))
.addValue("intManualFl",job.isManual());
getTemplate().update(getSql("create"), params);
return 0;
}