隐藏MySql Connector / J错误消息 - java.sql.SQLException:boo {感叹号}

时间:2013-05-29 12:09:41

标签: mysql spring

这个MySql错误消息的意思是什么?

java.sql.SQLException: boo!

springframework.dao.TransientDataAccessResourceException: CallableStatementCallback; SQL [{call sp_MyStoredProc(?, ?, ?)}]; boo!

这肯定不是特别有意义。有没有人遇到这个并且能够转化为不那么懒〜开发人员〜是......?

我通过org.springframework.jdbc.object.StoredProcedure

访问

我正在使用org.springframework.jdbc-3.1.3

@Update

违规行在CallableStatetement.java(2269-2271)

if (!found) {
     throw SQLError.createSQLException("boo!", "S1000", this.connection.getExceptionInterceptor());`
}

附加mysql-connector-java-5.1.18.jar的源代码并通过代码跟踪显示正确的消息应该是“声明的参数和实际参数之间不匹配”或类似的行。

确实正确地声明了我的输出参数

declareParameter(new SqlOutParameter("output", Types.INTEGER));

而不是

declareParameter(new SqlParameter("output", Types.INTEGER));

解决了我的问题。但更有意义的错误信息可以节省宝贵的时间。我将向MySql Connector / J开发团队提出这个建议。

1 个答案:

答案 0 :(得分:3)

如问题更新中所述,这通常是由于错误地使用CallableStatement引起的。例如:

存储过程使用2个参数,一个输入和一个输出:

CREATE DEFINER=`example`@`localhost` PROCEDURE `sp_getSensorLocation`(IN in_id VARCHAR(128), OUT loc VARCHAR(128))
BEGIN
SELECT LOCATION INTO loc FROM table.SENSORS
WHERE ID = in_id;
END

但是对它的调用仅使用1:

private String getSensorLocation(String sensorID) {    
    String location = "";
    Connection c = dbr.getConnection();
    String prepStatement = "{ call sp_getSensorLocation(?) } ";
    try {
         callableStatement cs = c.prepareCall(prepStatement);
         cs.setString(1, sensorID);
         ResultSet rs = cs.executeQuery();
         if (rs.next()) {
            location = rs.getString(1);
            }
         } catch (SQLException ex) {
                LOG.error("Error:", ex);
         }        
    dbr.closeConnection(c, rs, cs);
    return location;
}

当真正的代码真的是:

private String getSensorLocation(String sensorID) {
    String location = "";
    Connection c = dbr.getConnection();
    String prepStatement = "{ call sp_getSensorLocation(?, ?) } ";
    try {
        CallableStatement cs = c.prepareCall(prepStatement);
        cs.setString(1, sensorID);
        cs.execute();
        location = cs.getString(2);            
    } catch (SQLException ex) {
        LOG.error("Error:", ex);
    }
    dbr.closeConnection(c, rs, cs);
    return location;
}

注意我也改为cs.execute,因为我不期望结果集,并且也会遇到问题(这个例子来自我正在修复的其他人的代码,joys -_-)