2013-04-19 6 views
5

Ich versuche also, Daten aus einer DB abzurufen. Vielleicht habe ich es zu sehr angeschaut, aber ich kann das Problem nicht finden.Vorbereitete Anweisung SQL-Ausnahme "Keine Eingabeparameter"

Verbindung ist in Ordnung, Anweisung ist in Ordnung (funktioniert mit statischen Daten), und Daten vom Objekt Item sind korrekt.

Es sagt mir, es gibt keine Eingabeparameter für die Aussage. Die Ausnahme wird in der getSelectPrepareStatement()-Methode ausgelöst. Der Code ist:

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

Abrufen der PreparedStatement mit Satz Werte hier:

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

    return pStmt; 
} 

Die eexception auf den Anruf zu pStmt.setString(1, data); geworfen wird, obwohl ich die Aussage gesetzt ein Paramenter zu haben.

Der Fehler ist:

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 

Antwort

8

Das ist das Problem, in der SQL.

AND B.ID LIKE '?' 

Das ist kein Parameter hinzufügen - das ist ein Wert von ? spezifizieren, weil es in Anführungszeichen ist. Im Grunde sagen Sie, dass Sie eine Zeile finden möchten, in der B.ID ein einzelnes Fragezeichen ist.

Sie wollen:

AND B.ID LIKE ? 

Auf diese Weise sind Sie wirklich einen Parameter angeben.

1

Versuchen Sie, die einfachen Anführungszeichen um den Bindungsparameter zu entfernen. Das macht PreparedStatement für Sie.

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

Keine Notwendigkeit der Apostrophe für ?

Versuchen

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()+""); 
Verwandte Themen