java.sql.SQLException:参数索引超出范围(1>参数数量,为0)。
问题描述:
我有一个问题与此功能java.sql.SQLException:参数索引超出范围(1>参数数量,为0)。
String القيمة=jTextField3.getText();
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
try{
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/cars","root","123456");
pstmt=conn.prepareStatement("select القيمة from eradat WHERE DATE_FORMAT(التاريخ, \"%m-%Y\") = \"01-2015\";");
pstmt.setString(1,القيمة);
rs=pstmt.executeQuery();
while(rs.next()){
jTextField3.setText(rs.getString("القيمة"));
}
}
catch(Exception e){
JOptionPane.showMessageDialog(null, e);
}
finally{
try{
conn.close();
pstmt.close();
rs.close();
}
catch(Exception e){
}
}
我获得错误消息:值java.sql.SQLException:参数索引超出范围(1>参数的数量,这是0)。
答
您正试图向查询中添加一个参数,该参数不需要参数,只需从您的代码中删除pstmt.setString(1,القيمة);
,以使PreparedStatement不会将任何参数绑定到您提供的查询中。因此,在try catch块的代码应该是这样的:
try{
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/cars","root","123456");
pstmt=conn.prepareStatement("select القيمة from eradat WHERE DATE_FORMAT(التاريخ, \"%m-%Y\") = \"01-2015\";");
rs=pstmt.executeQuery();
while(rs.next()){
jTextField3.setText(rs.getString("القيمة"));
}
}
catch(Exception e){
JOptionPane.showMessageDialog(null, e);
}
如果您需要设置参数的查询,那么你需要在它使用一个占位符标志?
,在这种情况下,你就可以在查询中设置一个值。然后qiuery可能是这样的:
select القيمة from eradat WHERE DATE_FORMAT(التاريخ, \"%m-%Y\") = \"?\";
,你可以设置为where子句的值与
pstmt.setString(1,"01-2015");
答
您正在尝试使用未在您的语句中定义准备语句设置的参数。所以,简单地删除/注释以下行代码:
pstmt.setString(1,القيمة);
您的SQL没有任何参数标记(''?),所以没有参数,因此“参数的数量”为0 – Andreas
如果你总是从你的结果集中检索'rs.getString(“القيمة”)',你不需要这个'pstmt.setString(1,القيمة)'行。 – learningloop