Java 在下列情况下如何使用准备好的语句?

Java 在下列情况下如何使用准备好的语句?,java,prepared-statement,sqlexception,Java,Prepared Statement,Sqlexception,我有以下tabel-tblpers的数据库模式 Field Type Null Key Default Extra Privileges userid int(11) NO PRI (NULL) auto_increment firstname char(10) NO

我有以下tabel-tblpers的数据库模式

Field      Type         Null    Key     Default              Extra           Privileges                 

userid     int(11)      NO      PRI     (NULL)               auto_increment  
firstname  char(10)     NO                                
lastname   char(15)     NO              192.168.1.15
sdate  datetime     NO              0000-00-00 00:00:00
address    varchar(100) YES             (NULL)                
这是我的java代码

public class PSMTTest {

private static String jdbcDriver = "org.gjt.mm.mysql.Driver";
private static String host="localhost";
private static String userName = "root"; 
private static String password = "rootpass";

public static void main(String args[]){

    Connection con=null;
    try{
        if(jdbcDriver!=null){
            Class.forName(jdbcDriver);
            String url = "jdbc:mysql://"+host+"/mysql";
            con = DriverManager.getConnection(url,userName,password);

            String insertQuery="insert into `querytest`.`tblpers` " +
            "(`userid`,`firstname`,`lastname`,`sdate`,`address`)values ( NULL,?,?,Now(),NULL);";

            System.out.println("insertQuery : "+insertQuery);

            PreparedStatement psmt=con.prepareStatement(insertQuery);

            psmt.setString(2,"param");
            psmt.setString(3,"ganak");  //as per the sql exception error comes here
            psmt.executeUpdate();
            psmt.close();

        }
    }catch(ClassNotFoundException cnfe){
        cnfe.printStackTrace();
    }catch(SQLException sqle){
        sqle.printStackTrace();

    } catch (FileNotFoundException e) {

        e.printStackTrace();
    }
}
}
但当我尝试运行代码时,它抛出以下异常

java.sql.SQLException:参数索引超出范围(3>参数数量,即2)。 位于com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:2474) 位于com.mysql.jdbc.PreparedStatement.setString(PreparedStatement.java:3191) 在PSMTTest.main(PSMTTest.java:45)

我的用户ID是一个主键和自动递增字段,所以它的值由数据库自动生成。 对于字段firstname和lastname,我有值。 但在日期的情况下,我想添加数据库的当前数据和时间

对于地址,尚未提供值,因此应保持原样

请告诉我的朋友我的代码中的查询有什么问题? 为什么会有例外? 请引导我的朋友们!
谢谢大家!

错误消息是不言自明的-您只指定了两个参数占位符(问号),但尝试使用索引2和索引3。因此:

psmt.setString(2, "param");
psmt.setString(3, "ganak");
应该是:

psmt.setString(1, "param");
psmt.setString(2, "ganak");
它们是值列表中的第二个和第三个字段这一事实无关紧要——它们是第一个和第二个参数

您可以通过对SQL重新排序,使通信更加清晰:

String insertQuery = "insert into `querytest`.`tblpers` " +
    "(`firstname`, `lastname`, `sdate`, `userid`, `address`) values " + 
    "(?, ?, Now(), NULL, NULL);";
现在,第一个和第二个prepared语句参数与SQL中指定的第一个和第二个字段相对应


我不清楚您是否需要指定
userid
字段,请注意,因为默认情况下将提供该字段。老实说,我会将其从SQL中完全删除。

错误消息是不言自明的-您只指定了两个参数占位符(问号),但尝试使用索引2和3。因此:

psmt.setString(2, "param");
psmt.setString(3, "ganak");
应该是:

psmt.setString(1, "param");
psmt.setString(2, "ganak");
它们是值列表中的第二个和第三个字段这一事实无关紧要——它们是第一个和第二个参数

您可以通过对SQL重新排序,使通信更加清晰:

String insertQuery = "insert into `querytest`.`tblpers` " +
    "(`firstname`, `lastname`, `sdate`, `userid`, `address`) values " + 
    "(?, ?, Now(), NULL, NULL);";
现在,第一个和第二个prepared语句参数与SQL中指定的第一个和第二个字段相对应


我不清楚您是否需要指定
userid
字段,请注意,因为默认情况下将提供该字段。老实说,我会将其从SQL中完全删除。

您好,先生!很高兴再次看到你的答复。你的解决方案有效。您的意思是说psmt.setString()中的索引取决于问号的数量,而不是它们在查询中的位置。我说的对吗?@Param Ganak:您需要区分PreparedStatement理解的参数(只是问号)和SQL语句本身的参数(包括NULL、NOW()等)。您用于
setString(…)
的索引只是问号:
setString(1,“x”)
将有效地将第一个问号替换为“x”等。非常感谢您的解释,并回答了我的疑问。再次感谢您!你好,先生!很高兴再次看到你的答复。你的解决方案有效。您的意思是说psmt.setString()中的索引取决于问号的数量,而不是它们在查询中的位置。我说的对吗?@Param Ganak:您需要区分PreparedStatement理解的参数(只是问号)和SQL语句本身的参数(包括NULL、NOW()等)。您用于
setString(…)
的索引只是问号:
setString(1,“x”)
将有效地将第一个问号替换为“x”等。非常感谢您的解释,并回答了我的疑问。再次感谢您!