2014-12-21 15 views
6

Không phải là chuyên gia về ứng dụng web, gần đây tôi đang viết một ứng dụng web nhỏ cho ứng dụng di động của tôi bằng servlet. Chương trình nghị sự của tôi là nhận dữ liệu từ khách hàng và đưa nó vào trong db. mọi thứ đang chạy tốt, ngoại trừ câu lệnh chèn cơ sở dữ liệu của tôi, mà tôi đang cố gắng đạt được bằng cách sử dụng PreparedStatement.Câu lệnh đã chuẩn bị Chỉ số tham số ngoài phạm vi (0 <1)

// This is how my insert statement looks like 
private String INSERT_INTO_DEVICES = "INSERT INTO travlemate.devices (owner," 
     + "deviceid,gcmid) VALUES (?,?,?)"; 

// This is how am trying to insert 
PreparedStatement preparedStmt = mConn.prepareStatement(INSERT_INTO_DEVICES); 
preparedStmt.setString(0, data.getDeviceNumber()); 
preparedStmt.setString(1, data.getDeviceID()); 
preparedStmt.setString(2,data.getGcmId()); 
preparedStmt.execute(); 
mConn.close(); 

nhưng trong khi thực hiện nhiệm vụ này, đang nhận sau ngoại lệ

java.sql.SQLException: Parameter index out of range (0 < 1). 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910) 
    at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:2791) 
    at com.mysql.jdbc.PreparedStatement.setString(PreparedStatement.java:3627) 
    at com.mkgcorp.travelweb.data.DataManager.registerGCMData(DataManager.java:35) 
    at com.mkgcorp.travelweb.controller.Loader.doPost(Loader.java:46) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:644) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658) 
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1556) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1513) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Unknown Source) 

tôi đã cố gắng nghiêm túc tất cả các loại điều đó là có khả năng, nhưng ngoại lệ này không được đi xa, bất kỳ ý tưởng về giống nhau không?

Cảm ơn, chỉ số Techfist

+0

Đó là một trong những khác biệt ít phiền toái, nhưng các chỉ số báo cáo đã chuẩn bị bắt đầu tại 1 không 0 – MadProgrammer

Trả lời

25

PreparedStatement tham số bắt đầu từ 1

preparedStmt.setString(1, data.getDeviceNumber()); 
... 
+0

dựa trên lập chỉ mục của nó thực sự để khó nhớ nơi mà lập chỉ mục để làm theo. – Techfist

+0

bất kỳ ai thiết kế nó có thể nghĩ rằng việc sử dụng lập chỉ mục ngôn ngữ tự nhiên là một ý tưởng hay, tức là '1st',' 2nd';) – Reimeus

4
PreparedStatement preparedStmt = mConn.prepareStatement(INSERT_INTO_DEVICES); 
preparedStmt.setString(1, data.getDeviceNumber()); 
preparedStmt.setString(2, data.getDeviceID()); 
preparedStmt.setString(3,data.getGcmId()); 
preparedStmt.execute(); 
mConn.close(); 

thông số JDBC không zero-lập chỉ mục. Nó bắt đầu bằng 1, vì tất cả các chỉ mục trong các câu lệnh liên quan đến cơ sở dữ liệu đều bắt đầu bằng 1.

Các vấn đề liên quan