如何在以下情况下使用预备语句?

时间:2011-10-07 11:23:51

标签: 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                                
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,我有值。 但是在日期的情况下,我想添加数据库的当前数据和时间。

如果是地址,则尚未提供该值,因此应保持原样

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

1 个答案:

答案 0 :(得分:5)

错误消息是不言自明的 - 您只指定了两个参数占位符(问号),但您尝试使用索引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);";

现在,第一个和第二个预准备语句参数对应于SQL中指定的第一个和第二个字段。

我不清楚你需要指定userid字段,请注意 - 假设它默认提供。我会完全从SQL中删除它,说实话。