Par*_*nak 0 java sqlexception prepared-statement
我有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)
Run Code Online (Sandbox Code Playgroud)
这是我的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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我试图运行代码时它会引发异常
java.sql.SQLException:参数索引超出范围(3>参数个数,即2).at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:2474)at com.mysql.jdbc.PreparedStatement.setString(PreparedStatement.java:3191)at PSMTTest.main(PSMTTest.java:45)
我的userid是主键和自动增量字段,因此数据库自动生成它的值.对于字段firstname和lastname,我有值.但是在日期的情况下,我想添加数据库的当前数据和时间.
如果是地址,则尚未提供该值,因此应保持原样
请告诉我朋友我的代码中的查询有什么问题?为什么它会例外?请指导我的朋友们!谢谢!
错误消息是不言自明的 - 您只指定了两个参数占位符(问号),但您尝试使用索引2和3.所以这样:
psmt.setString(2, "param");
psmt.setString(3, "ganak");
Run Code Online (Sandbox Code Playgroud)
应该:
psmt.setString(1, "param");
psmt.setString(2, "ganak");
Run Code Online (Sandbox Code Playgroud)
它们是值列表中的第二个和第三个字段的事实是无关紧要的 - 它们是第一个和第二个参数.
您可以通过重新排序SQL来使通信更清晰:
String insertQuery = "insert into `querytest`.`tblpers` " +
"(`firstname`, `lastname`, `sdate`, `userid`, `address`) values " +
"(?, ?, Now(), NULL, NULL);";
Run Code Online (Sandbox Code Playgroud)
现在,第一个和第二个预准备语句参数对应于SQL中指定的第一个和第二个字段.
我不清楚你是否需要指定userid字段,请注意 - 默认情况下会提供它.说实话,我会完全从SQL中删除它.