2012-07-17 83 views
0

這是是我的DAO類:如何解決這個值java.sql.SQLException:語句參數<number>沒有設置

public Map<String, String> issueOrUpdate(Map<String,String> employeeTempcardMap){ 
     SlingDAO slingdao = new SlingDAO(); 
     Map<String, String> issueOrUpdateMap = new HashMap<String, String>(); 
     StringBuffer issueOrReturnTempcardQuery = new StringBuffer(); 
     String empname="",functionkey="",tempcardnumber="",dateofissue="",dateofreturn=""; 
     int empid=0,rowid=0,insertOrUpdateStatus=0; 
     Connection connection = slingdao.getConnection(); 
     PreparedStatement issueOrReturnPS=null; 
     if (connection != null) { 
      try { 
      if(employeeTempcardMap.get("functionkey").toString().equals("issueTempCard")){ 
       empid =Integer.parseInt(employeeTempcardMap.get("empid").toString()); //empname,tempcardnumber,dateofissue,rowid,dateofreturn 
       empname =employeeTempcardMap.get("empname").toString(); 
       tempcardnumber =employeeTempcardMap.get("tempcardnumber").toString(); 
       dateofissue =employeeTempcardMap.get("issuedate").toString(); 
       //System.out.println("11111111111111111111111111111111111"); 
       //System.out.println("empid : "+empid+" : empname: "+empname+" : tempcardnumber : "+tempcardnumber+": dateofissue "+dateofissue+"Status : "+applicationConstants.ISSUED); 

       issueOrReturnTempcardQuery.append(" INSERT INTO acct_tempcardhistory(empid,empname,tempcardnumber,tempcardstatus,issuedate,returndate) "); 
       issueOrReturnTempcardQuery.append(" VALUES(?,?,?,?,?,?) "); 
      }else{ 
       dateofreturn = employeeTempcardMap.get("returndate").toString(); 
       rowid = Integer.parseInt(employeeTempcardMap.get("rowid").toString()); 
       issueOrReturnTempcardQuery.append(" UPDATE acct_tempcardhistory SET tempcardstatus=?,returndate=? "); 
       issueOrReturnTempcardQuery.append(" WHERE id ="+rowid); 
      } 

       issueOrReturnPS = connection.prepareStatement(issueOrReturnTempcardQuery.toString()); 

       if(functionkey.equals("issueTempCard")){ 
        //System.out.println("2222222222222222222222"); 
        issueOrReturnPS.setInt(1, empid); 
        issueOrReturnPS.setString(2,empname.toString().trim()); 
        issueOrReturnPS.setString(3, tempcardnumber.toString().trim()); 
        issueOrReturnPS.setString(4, applicationConstants.ISSUED.toString().trim()); 
        issueOrReturnPS.setString(5, dateofissue.toString().trim()); 
        issueOrReturnPS.setString(6, "".toString().trim()); 
        //issueOrUpdateMap.put("message","Temporary Card has been issued to "+empid); 

       }else { 
        issueOrReturnPS.setString(1, applicationConstants.RETURNED); 
        issueOrReturnPS.setString(2,dateofreturn); 
        //issueOrUpdateMap.put("message","Temporary Card has been Returned by "+empid); 
       } 
       insertOrUpdateStatus = issueOrReturnPS.executeUpdate(); 

       System.out.println(insertOrUpdateStatus + "row(s) affected"); 

       if(insertOrUpdateStatus >0){ 
        issueOrUpdateMap.put("message","Temporary Card has been issued/Returned to "+empid); 
       }else{ 
        issueOrUpdateMap.put("message","Temporary Card has not been issued/Returned to "+empid); 
       } 
       connection.close(); 

       // connection.commit(); 
      } catch (Exception ex) { 
      ex.printStackTrace(); 
      issueOrUpdateMap.put("message","Temporary Card has not been issued/Returned to "+empid); 
      } finally { 
       try { 
       slingdao.closeConnection(connection, null, issueOrReturnPS); 
       } catch (Exception ex) { 
        ex.printStackTrace(); 
       } 
      } 
     } else { 
      issueOrUpdateMap.put("dbmessage","Connection not Established. Please Contact Vendor"); 
     } 
     return issueOrUpdateMap; 
    } 
} 

UPDATE:

堆棧跟蹤:

java.sql.SQLException: Statement parameter 3 not set. 
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910) 
     at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1045) 
     at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:693) 
     at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1404) 
     at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1318) 
     at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1303) 
     at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedS 
tatement.java:105) 
     at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedS 
tatement.java:105) 
     at com.slingmedia.notifier.dao.TempCardDAO.issueOrUpdate(TempCardDAO.java:158) 
     at com.slingmedia.notifier.servlet.TempCardServlet.doPost(TempCardServlet.java:83) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.j 
ava:305) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 

     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
     at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999 
) 
     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.jav 
a:565) 
     at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1812) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
     at java.lang.Thread.run(Thread.java:662) 

當我印刷,我看到所有的價值,但仍然表明,

java.sql.SQLException: Statement parameter <number> not set. 

相同的工作時更新,但它不適用於插入數據時,我也作爲一個字符串的日期。

請指導我如何去做或在哪裏做mistak?

問候

+0

介意給堆棧跟蹤?有關於代碼中的行號的說明? – 2012-07-17 08:38:40

+0

請查看更新的stacktrace,它給出了我在DAO方法中調用DAO方法的行號,在DAO中給出了'insertOrUpdateStatus = issueOrReturnPS中的行號。的executeUpdate(); ' – 2012-07-17 08:40:57

回答

2

你忘了functionKey表達式

employeeTempcardMap.get("functionkey").toString(); 

永遠不要聲明的結果,尤其是從未與虛擬值初始化您的本地變量提前。這只是掩蓋了這樣的編碼問題。如果你有final String functionKey = ...,這種錯誤在理論上是不可能的。

1

看看這個:

if(functionkey.equals("issueTempCard")){ 

現在考慮您期望的functionkey變量得到的值。你如何期待它等於issueTempCard?爲什麼創建SQL語句的條件與設置參數的條件不同?爲什麼你甚至有兩個單獨的if/else語句?

我強烈建議你重構這個方法 - 如果你讓代碼更清晰,它會幫助你更容易地發現這樣的問題。另外,我強烈建議您使用參數所有值,避免這樣的代碼:

issueOrReturnTempcardQuery.append(" WHERE id ="+rowid); 
+0

Jon Skeet,您的觀點非常有價值,實際上它幫助我解決了這個問題,但是Marko Topolnik提供了代碼中的問題,但我真的很喜歡您回答的方式,因此它不會成爲勺子餵食。謝謝。 – 2012-07-17 09:02:46

1

您有:

if(functionkey.equals("issueTempCard")){ 
        //System.out.println("2222222222222222222222"); 
        issueOrReturnPS.setInt(1, empid); 
        issueOrReturnPS.setString(2,empname.toString().trim()); 
        issueOrReturnPS.setString(3, tempcardnumber.toString().trim()); 
        issueOrReturnPS.setString(4, applicationConstants.ISSUED.toString().trim()); 
        issueOrReturnPS.setString(5, dateofissue.toString().trim()); 
        issueOrReturnPS.setString(6, "".toString().trim()); 
        //issueOrUpdateMap.put("message","Temporary Card has been issued to "+empid); 

       }else { 
        issueOrReturnPS.setString(1, applicationConstants.RETURNED); 
        issueOrReturnPS.setString(2,dateofreturn); 
        //issueOrUpdateMap.put("message","Temporary Card has been Returned by "+empid); 
       } 

的情況下,否則被調用時,你只設置參數1和2,但你有6個參數!

+0

爲什麼低調? – Tomer 2012-07-17 08:51:28

+0

sry我沒有downvoted,可能是其他人 – 2012-07-17 08:53:52

0

就意味着你要插入預期代碼少值...

例 要插入「1,2」 但預計代碼3 所以,它應該是「1,2」, 它會工作

相關問題