2013-05-29 20 views
3

這個MySql錯誤信息是什麼意思?Obscure MySql Connector/J錯誤信息 - java.sql.SQLException:boo {感嘆號}

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());` 
} 

Attching來源對於mysql-connector-java-5.1.18.jar並通過代碼跟蹤顯示正確的消息應該沿着th e「聲明的參數與實際參數之間的不匹配」或類似的行。

事實上正確說出我的輸出參數

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

而不是

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

固定我的問題。但更有意義的錯誤信息會節省寶貴的時間。我將向MySql Connector/J Development團隊提出這個建議。

+1

有人已經定製了我猜的錯誤消息! – NINCOMPOOP

+1

我已升級到mysql-connector-java-5.1.25,但錯誤消息保持不變。從Java訪問存儲過程肯定不是邊緣情況。 – eddyoc

+0

你有沒有試過搜索你的整個代碼庫的單詞「噓!」我很難相信Java人會用「噓!」來釋放代碼。信息。 – chrislondon

回答

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,因爲我不期望結果集,並且會遇到問題(這個例子取自我正在修復的其他人的代碼,喜歡-_-)