2013-04-19 30 views
5

quindi sto cercando di recuperare i dati da un DB. Forse l'ho guardato troppo ma non riesco a trovare il problema.Istruzione preparata SQL eccezione "Nessun parametro di input"

La connessione è soddisfacente, l'istruzione è valida (funziona con dati statici) e i dati dall'oggetto Item sono corretti.

Mi sta dicendo che non ci sono parametri di input per la dichiarazione. L'eccezione viene generata nel metodo getSelectPrepareStatement(). Il codice è:

public Result[] getItemsFromInput(Item item) throws SQLException { 
    PreparedStatement statement; 
    ArrayList<Result> results = new ArrayList<Result>(); 
    String query = "SELECT Code1, Name, A.Code2 " + 
        "FROM ItemTable A " + 
        "INNER JOIN CategoryTable B " + 
        "ON A.CatCode = B.CatCode" + 
        "AND B.ID LIKE '?'"; 
    statement = getSelectPrepareStatement(query, item.getTail().getId()+"%"); 

    ... 

    rs = queryForResultSet(statement); 

    while(rs.next()) { 
     results.add(new Result(
       rs.getString("ItemName"), 
       rs.getInt("ItemCode"), 
       rs.getString("ClassCode"))); 
    } 

    return results.toArray(new Result[results.size()]); 
} 

Recupero del PreparedStatement con valori impostati qui:

private PreparedStatement getSelectPrepareStatement(String SQL, String data) throws SQLException { 
    PreparedStatement pStmt = conn.prepareStatement(SQL); 
    pStmt.setString(1, data); 

    return pStmt; 
} 

L'eexception viene gettata sulla chiamata a pStmt.setString(1, data); anche se ho impostato la dichiarazione di avere un paramenter.

L'errore è:

java.sql.SQLException: No input parameters. 
     at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source) 
     at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source) 
     at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source) 
     at org.apache.derby.impl.jdbc.EmbedResultSet.noStateChangeException(Unknown Source) 
     at org.apache.derby.impl.jdbc.EmbedPreparedStatement.setString(Unknown Source) 
     at connection.Communicator.getSelectPrepareStatement(Communicator.java:306) 
     at connection.Communicator.getItemsFromInput(Communicator.java:56) 
     at frame.PromotionsDialog$1.propertyChange(PromotionsDialog.java:126) 
     at java.beans.PropertyChangeSupport.fire(PropertyChangeSupport.java:335) 
     at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:328) 
     at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:263) 
     at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:303) 
     at java.awt.Component.firePropertyChange(Component.java:8402) 
     at javax.swing.JComponent.firePropertyChange(JComponent.java:4494) 
     at frame.DataPanel$1.actionPerformed(DataPanel.java:130) 
     at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 
     at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 
     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:6505) 
     at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) 
     at java.awt.Component.processEvent(Component.java:6270) 
     at java.awt.Container.processEvent(Container.java:2229) 
     at java.awt.Component.dispatchEventImpl(Component.java:4861) 
     at java.awt.Container.dispatchEventImpl(Container.java:2287) 
     at java.awt.Component.dispatchEvent(Component.java:4687) 
     at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
     at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) 
     at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
     at java.awt.Container.dispatchEventImpl(Container.java:2273) 
     at java.awt.Window.dispatchEventImpl(Window.java:2719) 
     at java.awt.Component.dispatchEvent(Component.java:4687) 
     at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:729) 
     at java.awt.EventQueue.access$200(EventQueue.java:103) 
     at java.awt.EventQueue$3.run(EventQueue.java:688) 
     at java.awt.EventQueue$3.run(EventQueue.java:686) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
     at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
     at java.awt.EventQueue$4.run(EventQueue.java:702) 
     at java.awt.EventQueue$4.run(EventQueue.java:700) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
     at java.awt.EventQueue.dispatchEvent(EventQueue.java:699) 
     at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 
     at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
     at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 
    Caused by: java.sql.SQLException: No input parameters. 
     at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source) 
     at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown Source) 
     ... 51 more 
    Caused by: ERROR 07009: No input parameters. 
     at org.apache.derby.iapi.error.StandardException.newException(Unknown Source) 
     at org.apache.derby.impl.sql.GenericParameterValueSet.checkPosition(Unknown Source) 
     at org.apache.derby.impl.sql.GenericParameterValueSet.getParameterForSet(Unknown Source) 
     ... 47 more 

risposta

8

Questo è il problema, nel vostro SQL.

AND B.ID LIKE '?' 

che non è l'aggiunta di un parametro - che è specificare un valore di ?, perché è tra virgolette. Fondamentalmente, stai dicendo che vuoi trovare una riga dove B.ID è un singolo punto interrogativo.

desiderato:

AND B.ID LIKE ? 

In questo modo si sta veramente specificando un parametro.

1

Provare a rimuovere le virgolette singole attorno al parametro di collegamento. Questo è ciò che PreparedStatement fa per te.

String query = "SELECT Code1, Name, A.Code2 " + 
       "FROM ItemTable A " + 
       "INNER JOIN CategoryTable B " + 
       "ON A.CatCode = B.CatCode" + 
       "AND B.ID LIKE ?"; 
4

Non c'è bisogno di virgolette singole per ?

Prova

String query = "SELECT Code1, Name, A.Code2 " + 
        "FROM ItemTable A " + 
        "INNER JOIN CategoryTable B " + 
        "ON A.CatCode = B.CatCode" + 
        "AND B.ID LIKE ?%"; 
    statement = getSelectPrepareStatement(query, item.getTail().getId()+""); 
Problemi correlati