0 votos

tengo un jtexfield dentro de un jframe que solicita "fecha de nacimiento" además de otros campos.

El problema se presenta cuando quiero ingresar dicho campo a la base mysql ya que lo rechaza por ser nulo.

En la base esta definido como DATE y puede ser nulo ( NULL).

Sin embargo desde Netbeans se lista la excepción:

feb 22, 2021 3:15:51 PM vista.FrmPersonas registrarActionPerformed
GRAVE: null
com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Incorrect date value: 'null' for column 'per_fecha_nac' at row 1


la clase llama al método:
 

cp.actualizarPersona(el_id, tipo, apellido, nombre, sexo, nacionalidad, fecha_nac, lugar_nac, tipo_doc, cuit, profesion, nivel_educativo, estado_civil, conyuge_apellido, conyuge_nombre, estado);

donde fecha_nac es de tipo DATE,

y el método tiene la siguiente estructura:
 

Conexion cdb = ConectarServicio.getInstancia().getConexionDB();
        cdb.sql = "select * from personas where per_id = '" + p.getId() + "'";
        cdb.rs = cdb.st.executeQuery(cdb.sql);
        if (cdb.rs.next()) {
            cdb.sql = "update personas set per_tipo = '" + p.getTipo() +
                             "', per_apellido = '" + p.getApellido() +
                             "', per_nombre = '" + p.getNombre() +
                             "', per_sexo = '" + p.getSexo() +
                             "', per_nacionalidad = '" + p.getNacionalidad() +
                             "', per_fecha_nac = '" + p.getFecha_nac() +
                             "', per_lugar_nac = '" + p.getLugar_nac() +
                             "', per_tipo_doc = '" + p.getTipo_doc() +
                             "', per_cuit = '" + p.getCuit() +
                             "', per_profesion = '" + p.getProfesion() +
                             "', per_nivel_educativo = '" + p.getNivel_educativo() +
                             "', per_estado_civil = '" + p.getEstado_civil() +
                             "', per_conyuge_apellido = '" + p.getConyuge_apellido() +
                             "', per_conyuge_nombre = '" + p.getConyuge_nombre() +
                             "', per_estado = '" + p.getEstado() +
                             "' where per_id = '" + p.getId() + "'";
            cdb.st.executeUpdate(cdb.sql);

No he puesto la clase Personas "p", pero aclaro que todo funciona bien cuando ingreso una fecha valida dentro del respectivo campo. El problema es cuando dicho campo no contiene dato alguno.

Desde consola mysql, al mismo registro lo puedo ingresar con la misma instruccion "update" y el campos per_fecha_nac=null.

Cómo puedo solucionar ese inconveniente?

por en Java

1 Respuesta

0 votos

Para prevenir este tipo de errores y por seguridad con SQL es mejor utilizar PreparedStatement de Java.

Por ejemplo, con una plantilla reducida de tu caso, ponemos ? donde queramos aplicar un valor a la plantilla y creando un objeto PreparedStatement le añadimos cada uno de los valores con set en cada posición de la plantilla:

String plantillaConsulta = "select * from personas where per_id = '?' update personas set per_nombre = '?', per_fecha_nac = '?'"

PreparedStatement ps = conn.prepareStatement(plantillaConsulta);

prs.setInt(1, new Integer(p.getId()));

ps.setString(2, new String(p.getNombre()));

ps.setDate(3, new java.sql.Date(p.getFecha_nac().getTime()));

 

por
he probado tu sugerencia, pero llego exactamente al mismo error solo que ahora el mensaje es:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

en el mismo campo fecha_nac y es justamente... lo que quiero grabar... null.

Existe la alternativa de grabar una fecha cualquiera para esos casos, es decir 0001-01-01 pero la idea es que si la base permite null porque desde java no puedo hacerlo o mejor dicho... no se cómo hacerlo.

Gracias por ayudar.
Puede ser porque no coinciden el número de parámetros de la plantilla con los valores que le estás pasando o por un error de conexión con la base de datos. Prueba consultas simples, enviando menos valores y luego ve añadiendo.