我有以下用于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,我有值。 但是在日期的情况下,我想添加数据库的当前数据和时间。
如果是地址,则尚未提供该值,因此应保持原样
请告诉我朋友我的代码中的查询有什么问题? 为什么它会例外? 请指导我的朋友们! 谢谢!
答案 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中删除它,说实话。