各位高手,来帮小弟看一个关于PreparedStatement的问题

时间:2022-06-23 06:48:42
小弟不才,遇到一个奇怪的问题,代码如下:
String sql = "insert into sysuser (username, password, employee, sysmark) values (?, ?, ?, ?)";
Connection con = JavaDB.getConnection(); //我自己写了一个辅助类,使用连接池中的链接
PreparedStatement pstm = pstm = con.prepareStatement(sql);
pstm.setString(1, SysUser.getUserName());
pstm.setString(2, SysUser.getPassword());
pstm.setString(3, SysUser.getEmployee());
pstm.setString(4, SysUser.getSysMark());
System.out.println(sql);
pstm.executeUpdate();
执行上述代码的时候抛出异常,大体的意思是执行的SQL语句语法有误,我调用System.out.println(sql);这条语句后发现,执行的SQL语句为insert into sysuser (username, password, employee, sysmark) values (?, ?, ?, ?),也就是说,setString方法根本没有起作用。实在找不出问题的原因,请大家帮我分析一下。多谢!

7 个解决方案

#1


PreparedStatement表示预编译的 SQL 语句的对象。 SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。 而不是将值存在sql语句当中.. 
你使用System.out.println(sql);输出的结果当然是你上面定义的,和setSring无关

你SQL语句有误,最好手动拼接下
String sql = "insert into sysuser (username, password, employee, sysmark) values ('"+SysUser.getUserName()+"', '"+SysUser.getPassword()+"', '"+SysUser.getEmployee()+"', '"+SysUser.getSysMark()+"')";


这样输出下,在数据库中测试,看下你的SQL语句问题

#2


你如何确认setString方法没起作用呢?
打印出来的sql不会把参数加入进去。
你确认一下你连接的数据库是否有这个表。
然后把这段sql单独执行,调试好以后再copy过来。
把pstm.executeUpdate();方法换成:
pstm.execute();

#3


 

String sql = "insert into sysuser (username, password, employee, sysmark) values (?, ?, ?, ?)";
Connection con = JavaDB.getConnection(); 
PreparedStatement pstm = con.prepareStatement(sql);
pstm.setString(1, SysUser.getUserName());
pstm.setString(2, SysUser.getPassword());
pstm.setString(3, SysUser.getEmployee());
pstm.setString(4, SysUser.getSysMark());
pstm.executeUpdate();

在我机子上运行没问题的,如果还是不行你就用一楼拼接的方式,我以前也遇到过这种情况,我也用拼接的方式解决的。
还有就是String sql 定义一个Sting变量后,常量的值是不会因为setSting的方式而改变的。

#4


引用楼主 xscisco 的回复:
小弟不才,遇到一个奇怪的问题,代码如下:
String sql = "insert into sysuser (username, password, employee, sysmark) values (?, ?, ?, ?)";
Connection con = JavaDB.getConnection(); //我自己写了一个辅助类,使用连接池中的链接
PreparedStatement  pstm = pstm = con.prepareStatement(sql);


这个是你发帖的时候的笔误吧!!还是。。。。。。

#5


pstm.executeUpdate();这是好像是修改用的 

#6


如果pstm没有问题的话。我认为你应该对照一下数据中的表,尤其是大小写部分,仔细对照一下字段,我曾经写存储过程的时候就对错了!这是小弟的一点愚见!

#7


引用 4 楼 laolik 的回复:
引用楼主 xscisco 的回复:
小弟不才,遇到一个奇怪的问题,代码如下:
String sql = "insert into sysuser (username, password, employee, sysmark) values (?, ?, ?, ?)";
Connection con = JavaDB.getConnection(); //我自己写了一个辅助类,使用连接池中的……

先回答这个问题,才好继续……

#1


PreparedStatement表示预编译的 SQL 语句的对象。 SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。 而不是将值存在sql语句当中.. 
你使用System.out.println(sql);输出的结果当然是你上面定义的,和setSring无关

你SQL语句有误,最好手动拼接下
String sql = "insert into sysuser (username, password, employee, sysmark) values ('"+SysUser.getUserName()+"', '"+SysUser.getPassword()+"', '"+SysUser.getEmployee()+"', '"+SysUser.getSysMark()+"')";


这样输出下,在数据库中测试,看下你的SQL语句问题

#2


你如何确认setString方法没起作用呢?
打印出来的sql不会把参数加入进去。
你确认一下你连接的数据库是否有这个表。
然后把这段sql单独执行,调试好以后再copy过来。
把pstm.executeUpdate();方法换成:
pstm.execute();

#3


 

String sql = "insert into sysuser (username, password, employee, sysmark) values (?, ?, ?, ?)";
Connection con = JavaDB.getConnection(); 
PreparedStatement pstm = con.prepareStatement(sql);
pstm.setString(1, SysUser.getUserName());
pstm.setString(2, SysUser.getPassword());
pstm.setString(3, SysUser.getEmployee());
pstm.setString(4, SysUser.getSysMark());
pstm.executeUpdate();

在我机子上运行没问题的,如果还是不行你就用一楼拼接的方式,我以前也遇到过这种情况,我也用拼接的方式解决的。
还有就是String sql 定义一个Sting变量后,常量的值是不会因为setSting的方式而改变的。

#4


引用楼主 xscisco 的回复:
小弟不才,遇到一个奇怪的问题,代码如下:
String sql = "insert into sysuser (username, password, employee, sysmark) values (?, ?, ?, ?)";
Connection con = JavaDB.getConnection(); //我自己写了一个辅助类,使用连接池中的链接
PreparedStatement  pstm = pstm = con.prepareStatement(sql);


这个是你发帖的时候的笔误吧!!还是。。。。。。

#5


pstm.executeUpdate();这是好像是修改用的 

#6


如果pstm没有问题的话。我认为你应该对照一下数据中的表,尤其是大小写部分,仔细对照一下字段,我曾经写存储过程的时候就对错了!这是小弟的一点愚见!

#7


引用 4 楼 laolik 的回复:
引用楼主 xscisco 的回复:
小弟不才,遇到一个奇怪的问题,代码如下:
String sql = "insert into sysuser (username, password, employee, sysmark) values (?, ?, ?, ?)";
Connection con = JavaDB.getConnection(); //我自己写了一个辅助类,使用连接池中的……

先回答这个问题,才好继续……