'无法在位置设置参数'当更新具有NULL值的行时

时间:2016-05-16 22:23:04

标签: java mysql

我在制作这部作品时遇到了一些麻烦。我有一个表,其中三个字段可以为NULL:alumno,fechaInicio和fechaDefensa。我将可能的空值传递给另一个方法来检查它们。

---

因为我不能直接将值设置为NULL,所以我有第二种方法检查字段是空还是空,然后将其设置为空。

public static void actualizarProyecto(int id, String nombre, String descripcion, String alumno, String profesor, String fechaInicio, String fechaDefensa, String convocatoria, int finalizado, int disponible, float nota) {
    consulta = "UPDATE proyectos SET nombre='" + nombre + "', descripcion='" + descripcion + "', alumno='" + alumno + "', profesor='" + profesor + "', fecha_inicio='" + fechaInicio + "',"
            + "fecha_defensa='" + fechaDefensa + "', convocatoria='" + convocatoria + "', "
            + "finalizado=" + finalizado + ", disponible=" + disponible + ", nota='" + nota + "' WHERE id=" + id + "";
    CONEXION.actualizarProyecto(consulta, alumno, fechaInicio, fechaDefensa);
}

运行程序时,我得到public void actualizarProyecto(String consulta, String alumno, String inicio, String defensa) { PreparedStatement state = null; try { state = conexion.prepareStatement(consulta); if (alumno == null) { state.setNull(3, Types.VARCHAR); } else { state.setString(3, alumno); } if ("".equals(inicio)) { state.setNull(4, Types.DATE); } else { state.setString(4, inicio); } if ("".equals(defensa)) { state.setNull(5, Types.DATE); } else { state.setString(5, defensa); } state.executeQuery(); } catch (SQLException e) { JOptionPane.showMessageDialog(null, e.getMessage(), "Error al insertar el contenido en la BBDD.", JOptionPane.ERROR_MESSAGE); } }

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

为了在预准备语句中设置参数值,语句需要包含'?'对于您正在设置的每个参数。例如:

consulta = "UPDATE proyectos SET nombre=?, descripcion=?, " +
    "alumno=?, profesor=?, fecha_inicio=?, fecha_defensa=?, " +
    "convocatoria=?, finalizado=?, disponible=?, nota=? WHERE id=?";

然后,为每个'?'设置参数。

这种方法的另一个好处是它可以帮助您避免SQL注入。