我有这段代码
sql="update rpttbl set salary= ?";
PreparedStatement presptStmt2=conCreate.prepareStatement(sql);
rs=rptStmt.executeQuery("select temp from rpttbl");
while (rs.next()){
System.out.println(rs.getString(1));
rs2=st.executeQuery("select sa8 from sarchive where sempid="+rs.getString(1)+" and "
+ "(sdate='"+Globals.year+"-"+Globals.date+"-28' or sdate='0000-00-00')");
if(!rs2.next()){
System.out.println("no records");
presptStmt2.setString(1,"000");
presptStmt2.addBatch();
}
else{
System.out.println(rs2.getString(1));
presptStmt2.setString(1,rs2.getString(1));
presptStmt2.addBatch();
}
}
presptStmt2.executeBatch();
执行后,所有行的(薪水)列都是“000”。 似乎else块中的prepStmt2从未执行但是(rs2.getString(1))工作得很好。
请帮助
答案 0 :(得分:0)
更新查询没有条件:
update rpttbl set salary= ?
它将批量执行此查询,但只有最后一次执行才有意义,因为您更新了具有相同salary
值的每一行。
为该查询添加条件并更新逻辑以将该ID添加到PreparedStatement
update rpttbl set salary= ? where some_id = ?
并且
prepStmt2.set***(2, <someId>);
仅供参考:你不应该相信你的数据:
rs2=st.executeQuery("select sa8 from sarchive where sempid="+rs.getString(1)+" and "
+ "(sdate='"+Globals.year+"-"+Globals.date+"-28' or sdate='0000-00-00')");
您正在使用PreparedStatement
,因此您了解SQL注入,但是当您从数据库本身连接值时,您可以找到一些注入。永远不要在SQL中推出String
。
请改用PreparedStatement
并使用可用的绑定参数传递参数。
我们昨天在Can this simple String escaping prevent any SQL Injections?上与answer from Tschallacka进行了此对话。