未分类的SQLException Jdbc Template

4

我试图调用一个存储过程在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;

}

2个回答

0

你能否请求服务器端的跟踪信息或在启用跟踪的服务器上重现此问题?因为客户端未知错误可能会以更具体的方式记录在你的SQL Server服务器上。


-1

当我调用其他存储过程时,我遇到了同样的问题。我改变了调用存储过程的方法,如下所示,它似乎可以工作。我不完全确定doInPreparedStatement的工作原理,因此可能有更好的使用方法,但这似乎解决了我的问题。

 public int create(Job job) {
    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())
            .addValue("insertDate",dateTimeString(DateTime.now(DateTimeZone.UTC)));

    getTemplate().execute(getSql("create"), params, new PreparedStatementCallback<Boolean>(){
        @Override  
        public Boolean doInPreparedStatement(PreparedStatement ps)  
                throws SQLException, DataAccessException {   

            return 0;   
        }  
        });
   return (int)params.getValue("intSiteId");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接