java - 使用 NULL 值更新行时“无法在位置设置参数”

标签 java mysql

我在执行此操作时遇到了一些问题。我有一个表,其中三个字段可以为 NULL:alumno、fechaInicio 和 fechaDefensa。我将可能的空值传递给另一个方法来检查它们。

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);
}

因为我不能直接将值设置为 NULL,所以我使用第二种方法来检查字段是否为 null 或空,然后将其设置为 null。

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);
    }
}

运行程序时我得到Could not set parameter at position 3, parameter length is 0

我该如何解决这个问题?

最佳答案

为了在准备好的语句中设置参数值,该语句需要包含一个“?”对于您设置的每个参数。例如:

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

然后,您为每个“?”设置参数。

这种方法的额外好处是它可以帮助您避免 SQL 注入(inject)。

关于java - 使用 NULL 值更新行时“无法在位置设置参数”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37264201/

相关文章:

java - JAVA 如何知道我的 CSV 文件列的数据类型

java - Spring 启动-com.mysql.jdbc.spring启动异常.jdbc4.MySQLSyntaxErrorException : Unknown column 'customer0_.email' in 'field list'

Java JSP/Servlet : controller servlet throwing the famous stack overflow

mysql - 当我们在mysql查询中使用distinct时如何获取其他列

java - 文件中的mysql数据库url,用户名和密码

mysql - 无法删除表单数据库 SQLGrammarException

java - 如何向数据库中插入百万条数据

java - iText PdfCopy 创建可编辑的 pdf 文档

php - Google map 未在 PHP/MySQL 页面中显示

mysql - 通过对自身执行查询来更新表