JDBC误差参数索引超出范围(2>的参数号,它是1)

问题描述:

我写以下Java方法,当我调用它,给我的错误JDBC误差参数索引超出范围(2>的参数号,它是1)

Parameter index out of range (2 > number of parameters, which is 1). 

则在线路preparedStatement时给错误.setInt(2,p);

for(int t=0;t<2 & exit;t++){ 
    sql="SELECT allocationProb FROM trial.teacherallocation where TeacherID=?;"; 
        preparedStatement = dbConnection.prepareStatement(sql); 
        preparedStatement.setString(1,var1[t]); 
        ResultSet rs3=preparedStatement.executeQuery(); 
        rs3.next(); 
        int allocationProb=rs3.getInt(1); 
        rs3.close(); 
        System.out.println("INSIDE"); 
        int p=0; 
        if(allocationProb==0){ 
         p=1; 
        sql="UPDATE `trial`.`teacherallocation` SET `AllocationSub1`=?,` allocationProb`=? WHERE `TeacherID`=?;"; 
        preparedStatement.setString(1,str1); 
        preparedStatement.setInt(2,p); 
        preparedStatement.setString(3,var1[t]); 
        preparedStatement.executeUpdate(); 
        } 
} 
+1

您使用预处理语句是SQL'SQL = “SELECT allocationProb FROM trial.teacherallocation其中TeacherID = ?;”;'其中只有一个参数。 – 2013-03-25 14:30:16

对两个不同的SQL语句使用相同的准备语句。参数数量也不同。这就是你得到这个错误的原因。

尝试以下

如果(allocationProb == 0){ P = 1;preparedStatement = dbConnection.prepareStatement(sql);

希望它可以帮助

您不能重复使用准备好的语句那样,每个SQL语句应该得到它自己的PreparedStatement。您可以使用预准备语句多次执行一条SQL,但对于不同的SQL语句,您需要从连接中获取新的PreparedStatement。

就像你写的那样,PreparedStatement不知道你改变了sql变量的内容,这就是为什么它会给你提供错误信息。

虽然你改变sql变量

sql="UPDATE `trial`.`teacherallocation` SET `AllocationSub1`=?,` allocationProb`=? WHERE `TeacherID`=?;"; 

你不创建一个新的PreparedStatement它。所以,当你调用

preparedStatement.setString(1,str1); 
preparedStatement.setInt(2,p); 
preparedStatement.setString(3,var1[t]); 
preparedStatement.executeUpdate(); 

你调用它的SQL

sql="SELECT allocationProb FROM trial.teacherallocation where TeacherID=?;"; 

其中只有1个参数,如果你尝试添加更多的将抛出一个异常。

您需要在这些行之前创建一个新的或重新分配PreparedStatement对象。

sql="UPDATE `trial`.`teacherallocation` SET `AllocationSub1`=?,` allocationProb`=? WHERE `TeacherID`=?;"; 
preparedStatement = dbConnection.prepareStatement(sql); 
preparedStatement.setString(1,str1); 
preparedStatement.setInt(2,p); 
preparedStatement.setString(3,var1[t]); 
preparedStatement.executeUpdate(); 

此外,您应该关闭所有的jdbc连接,当你完成它们。

preparedStatement.close();

+0

非常感谢 – irobo 2013-03-25 14:41:20

+1

如果有任何答案是有帮助的,你可以对他们和/或接受一个。 – 2013-03-25 14:42:07

+0

@ user2094670:如果您认为Sotirios的回答很有帮助,我建议您应该接受并注意它。 – 2013-03-25 17:14:59