2013-04-19 33 views
5

vì vậy tôi đang cố truy xuất dữ liệu từ một DB. Có lẽ tôi đã xem xét nó quá nhiều nhưng tôi không thể tìm thấy vấn đề.Tuyên bố được chuẩn bị SQL Ngoại lệ "Không có tham số đầu vào"

Kết nối tốt, Tuyên bố là tốt (hoạt động với dữ liệu tĩnh) và dữ liệu từ đối tượng Item là chính xác.

Điều đó cho tôi biết không có tham số đầu vào nào cho câu lệnh. Ngoại lệ được ném theo phương pháp getSelectPrepareStatement(). Mã này là:

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

Lấy PreparedStatement với thiết lập giá trị ở đây:

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

    return pStmt; 
} 

các eexception đã được ném vào các cuộc gọi đến pStmt.setString(1, data); mặc dù tôi thiết lập báo cáo kết quả để có một paramenter.

Lỗi này là:

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 

Trả lời

8

Đây là vấn đề, trong SQL của bạn.

AND B.ID LIKE '?' 

Không thêm thông số - đó là chỉ định giá trị ?, vì nó được trích dẫn. Về cơ bản, bạn đang nói rằng bạn muốn tìm một hàng nơi B.ID là một dấu chấm hỏi duy nhất.

Bạn muốn:

AND B.ID LIKE ? 

Bằng cách đó bạn đang thực sự xác định một tham số.

1

Thử xóa các dấu nháy đơn khỏi xung quanh tham số liên kết. Đó là những gì PreparedStatement làm cho bạn.

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

Không cần dấu nháy đơn cho ?

Hãy thử

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()+""); 
Các vấn đề liên quan