2017-04-14 29 views
0

這是sql語句。該錯誤顯示爲「pStat.setString(2,rp.getLegalDescription());」我的程序按預期工作我正在從數據庫中刪除一條記錄,除了無效的列索引異常外,它正常工作

private static final String REMOVE_OBJECT = "DELETE FROM RES where ID = ?"; 

這是刪除行的方法。

private boolean deletePreparedStatement(ResidentialProperty rp) 
{ 
    try 
    { 
     /* 
     * (long id, java.lang.String legalDescription, java.lang.String address, java.lang.String quadrant, java.lang.String zone, double askingPrice, java.lang.String comments, double area, double bathrooms, int bedrooms, char garage) 
     */ 

     PreparedStatement pStat = conn.prepareStatement(REMOVE_OBJECT); 

     pStat.setLong(1, rp.getId()); 
     pStat.setString(2, rp.getLegalDescription()); 
     pStat.setString(3, rp.getAddress()); 
     pStat.setString(4, rp.getQuadrant()); 
     pStat.setString(5, rp.getZone()); 
     pStat.setDouble(6, rp.getAskingPrice()); 
     pStat.setString(7, rp.getComments()); 
     pStat.setDouble(8, rp.getArea()); 
     pStat.setDouble(9, rp.getBathrooms()); 
     pStat.setInt(10, rp.getBedrooms()); 
     pStat.setString(11, rp.getGarage()+""); 
     pStat.setLong(12, rp.getId()); 

     int rowCount = pStat.executeUpdate(); 
     System.out.println("row count = "+ rowCount); 
     pStat.close(); 
     return rowCount == 1; 
    } 
    catch(SQLException e) 
    { 
      e.printStackTrace(); 
    } 
    return false; 
} 

這是真正把它拿出來的數據庫

public boolean remove(Object o) 
{ 
    ResidentialProperty rp = (ResidentialProperty)o; 
     try 
     { 
      PreparedStatement pstat = conn.prepareStatement(REMOVE_OBJECT); 
      pstat.setLong(1, rp.getId()); 
      rs = pstat.executeQuery(); 
      rs.close(); 
      pstat.close(); 
     }catch(SQLException e) 
     { 
      e.printStackTrace(); 
     } 

     return deletePreparedStatement(rp); 
} 

的方法,最後的錯誤日誌如下所示。非常感謝您的閱讀。我會繼續嘗試解決這個,因爲這被貼

java.sql.SQLException: Invalid column index 
sucessful remove 
at oracle.jdbc.driver.OraclePreparedStatement.setStringInternal(OraclePreparedStatement.java:5168) 
at oracle.jdbc.driver.OraclePreparedStatement.setString(OraclePreparedStatement.java:5156) 
at oracle.jdbc.driver.OraclePreparedStatementWrapper.setString(OraclePreparedStatementWrapper.java:278) 
at saitMLS.persistance.property.ResidentialPropertyBroker.deletePreparedStatement(ResidentialPropertyBroker.java:181) 
at saitMLS.persistance.property.ResidentialPropertyBroker.remove(ResidentialPropertyBroker.java:455) 
at saitMLS.problemDomain.property.UserInterface$2.actionPerformed(UserInterface.java:705) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
at java.awt.Component.processMouseEvent(Component.java:6533) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) 
at java.awt.Component.processEvent(Component.java:6298) 
at java.awt.Container.processEvent(Container.java:2236) 
at java.awt.Component.dispatchEventImpl(Component.java:4889) 
at java.awt.Container.dispatchEventImpl(Container.java:2294) 
at java.awt.Component.dispatchEvent(Component.java:4711) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466) 
at java.awt.Container.dispatchEventImpl(Container.java:2280) 
at java.awt.Window.dispatchEventImpl(Window.java:2746) 
at java.awt.Component.dispatchEvent(Component.java:4711) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) 
at java.awt.EventQueue.access$500(EventQueue.java:97) 
at java.awt.EventQueue$3.run(EventQueue.java:709) 
at java.awt.EventQueue$3.run(EventQueue.java:703) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) 
at java.awt.EventQueue$4.run(EventQueue.java:731) 
at java.awt.EventQueue$4.run(EventQueue.java:729) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 

回答

1

你只需要只ID單獨傳遞給PreparedStatement對象,因爲你的SQL(DELETE FROM RES where ID = ?)只接受一個參數(即ID)。

所以只保留一個(ID)參數(如下圖所示),在您的deletePreparedStatement方法去除pStat.setString,等參數的其餘部分:

pStat.setLong(1, rp.getId()); 

作爲一個方面說明,我強烈建議您關閉finally塊中的PreparedStatement對象或使用嘗試與資源

+0

非常感謝你,你快!我感謝幫助! –

+0

如果有幫助,您可以點名並接受我的答案 – developer