2014-01-22 29 views
-1

你好我试图插入到数据库中,我得到的错误:Java的SQL数据库参数索引超出范围

SQL Exception: java.sql.SQLException: Parameter index out of range (6 > number of parameters, which is 5). 

的代码导致这就是:

PreparedStatement st = connection.prepareStatement("INSERT INTO Members VALUES ('?','?','?','?','?','?','?','?','?','?','?','?','?','?'','?','?','?','?','?'"); 
     st.setString(1, username); 
     st.setString(2, id); 
     st.setString(3, firstName); 
     st.setString(4, lastName); 
     st.setString(5, address); 
     st.setString(6, phone); 
     st.setString(7, email); 
     st.setInt(8, age); 
     st.setString(9, String.valueOf(sex)); 
     st.setDouble(10, height); 
     st.setInt(11, kgs); 
     st.setDouble(12, stone); 
     st.setInt(13, targetWeightKgs); 
     st.setDouble(14, bmi); 
     st.setString(15, medicalHistory); 
     st.setString(16, extraHistory); 
     st.setBoolean(17, smoker); 
     st.setBoolean(18, usernameCompleted); 
     st.setString(19, myNotes); 
     st.executeUpdate(); 
+0

您可以显示数据库中的表? – ashokramcse

回答

1

你不应该引用您的?占位符,即使它们表示字符串数据。引用的问号将被解释为文字'?'字符串。它可能解释为5个参数,因为你的第6到最后一个参数有两个'字符,所以你最后的5个? s的解释为单引号之外。

尝试

connection.prepareStatement("INSERT INTO Members VALUES 
    (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); 

UPDATE

有关闭 “)” 失踪的INSERT语句,我现在又增加了。

+0

使用prepareStatement非常好,但是肯定必须有更好的方法来创建更复杂的prepareStatement,比如这个。我的意思是使用15x'?'是不可行的... –

+0

@ i-bob您的评论没有多大意义。为什么要创建比这更复杂的'PreparedStatement'?问题中没有任何事情表明任何更复杂的东西都是必需的,或者这需要执行15次,尽管'PreparedStatement'仍然是无论如何要走的路。 – rgettman

+0

我的意思是,当然这是一个有效的问题的答案,我只是问如何做到这一点或许在一些更好的方式,如果有人知道怎么那么他就可以与我们分享......我的意思是使用像的DAO等。 –

0

你不需要'周边?的。

PreparedStatement st = connection.prepareStatement("INSERT INTO Members VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?"); 

BUT这里真正的问题是你双单引号的?的一个样子:'?'',

0

有在行

preparedStatement在你的示例代码一个错误,如果你已经完成了你原来的代码中有相同的错误,那么它将无法工作!

退房的问号和'你不需要'

0

替换“?”通过?

INSERT INTO Members VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);