Java 在下列情况下如何使用准备好的语句?
我有以下tabel-tblpers的数据库模式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
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”等。非常感谢您的解释,并回答了我的疑问。再次感谢您!