Lỗi: com.microsoft.sqlserver.jdbc.SQLServerException: The index 2 is out of range

Mình có hàm update thông tin của người dùng như sau

    public void updateAccount(String username, String name, String address, String aboutMe, String id) {
        String sql = "update Account set username = '?', \n"
                + "				   [Full_Name] = '?',\n"
                + "				   [Address] = '?',\n"
                + "				   [about_me] = '?'\n"
                + "				   where id = ?";
        try {
            PreparedStatement ps = connection.prepareStatement(sql);
            ps.setString(1, username);
            ps.setString(2, name);
            ps.setString(3, address);
            ps.setString(4, aboutMe);
            ps.setString(5, id);
            ps.executeUpdate();

        } catch (Exception ex) {
            Logger.getLogger(AccountDao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

và chương trình báo lỗi như thế này:

Severe:   com.microsoft.sqlserver.jdbc.SQLServerException: The index 2 is out of range.
	at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:191)
	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setterGetParam(SQLServerPreparedStatement.java:933)
	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setValue(SQLServerPreparedStatement.java:948)
	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setString(SQLServerPreparedStatement.java:1578)
	at dao.AccountDao.updateAccount(AccountDao.java:117)
	at controller.UserProfileController.doPost(UserProfileController.java:91)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:416)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:283)
	at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
	at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206)
	at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180)
	at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
	at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111)
	at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
	at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536)
	at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
	at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591)
	at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571)
	at java.lang.Thread.run(Thread.java:748)

Mình không hiểu tại sao nó lại bị lỗi " The index 2 is out of range" và có cách nào để sửa nó không ạ?

Cảm ơn cậu đã đưa đầy đủ thông tin dưới dạng text nhé! Đặc biệt là full stacktrace. Vì một lý do nào đó, không nhiều người tử tế đưa toàn bộ stacktrace trong câu hỏi :smile:

Cậu thử bỏ ' ở xung quanh ? xem.
Trong câu query của cậu, các dấu ? đều được bọc trong ', trừ field id. Điều đó có nghĩa là, các dấu ? ngoài field id sẽ được coi là xâu, và thư viện sẽ không map các dấu ? đó với parameter cậu đưa.
Chỉ có duy nhất trường id được map (với index 1), nên index 2 trở đi bị “out of range”.

Hope it helps!

4 Likes

Cảm ơn bạn vì câu trả lời này thực sự hữu ích. Nhưng sau khi sửa, mình vẫn chưa update được thông tin của người dùng với lỗi như thế này:
com.microsoft.sqlserver.jdbc.SQLServerException: Cannot insert the value NULL into column ‘username’, table ‘FERA_ONL_LEARNING.dbo.Account’; column does not allow nulls. UPDATE fails. dù mình đã thay đổi các giá trị của chúng.

Mình đã cố gắng sửa nhưng vẫn không được, có cách nào để khắc phục được nó không ạ? :<

1 Like

Bằng cách nào đó tớ miss câu hỏi follow up của cậu.
Có thể đã muộn, cơ mà cậu có thể thử debug để xem chính xác giá trị cậu định insert/update có bị NULL không. Nó không quá khó đâu :slight_smile:

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?