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)。

+2

您的SQL没有任何参数标记(''?),所以没有参数,因此“参数的数量”为0 – Andreas

+0

如果你总是从你的结果集中检索'rs.getString(“القيمة”)',你不需要这个'pstmt.setString(1,القيمة)'行。 – learningloop

您正试图向查询中添加一个参数,该参数不需要参数,只需从您的代码中删除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,القيمة);