miércoles, 24 de marzo de 2010

Ejecutando sentencias SQL JDBC!!! 2 Parte

En la primera parte del tutorial Ejecutando sentencias SQL JDBC!!!, insertamos un registro con éxito. Al ejecutar por segunda vez el tutorial tenemos que nos dará el siguiente error:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1' for key 1

Este error dá porque la columna "id_persona" es la clave primaria de la tabla y está no acepta duplicados.

Lo que vamos hacer ahora es ejecutar una consulta en la tabla antes de insertar algun registro, a continuación agregamos las senténcias que ejecutará las acciones:

// Crear un Objeto Statement para ejecutar la consulta a la BD
Statement st = con.createStatement();
// Se selecciona el máximo id de la persona
ResultSet rs = st.executeQuery("select max(id_persona) from persona");
int idPersona;
// Se comprueba que el ResultSet tenga resultados
if (rs.next()) {
// Se obtiene el unico y se incrmenta en 1 su valor
idPersona = rs.getInt(1);
idPersona++;
} else {
// si no hay resultado es el primer registro a insertar
idPersona = 1;
}

Luego en pstm.setInt(1, 1); del código anterior los sustituimos por: pstm.setInt(1, idPersona); para que cada vez que se ejecute el programa se genere un id_persona diferente.

Aqui anexo el código completo:

package hellojdbc;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Calendar;

/**
*
* @author carlos
*/
public class Main {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// Cargar controlador mysql de la base de datos
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
try {
// Crear conexión a la Base de Datos
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/Prueba", "prueba", "prueba");
// Crear un Objeto Statement para ejecutar la consulta a la BD
Statement st = con.createStatement();
// Se selecciona el máximo id de la persona
ResultSet rs = st.executeQuery("select max(id_persona) from persona");
int idPersona;
// Se comprueba que el ResultSet tenga resultados
if (rs.next()) {
// Se obtiene el unico y se incrmenta en 1 su valor
idPersona = rs.getInt(1);
idPersona++;
} else {
// si no hay resultado es el primer registro a insertar
idPersona = 1;
}

String SQL = "insert into persona(id_persona,nombre_persona,apellido_persona,fecha_nac_persona) values(?,?,?,?)";
PreparedStatement pstm = con.prepareStatement(SQL);
// Ejecutar sentencia SQL para insertar datos
pstm.setInt(1, idPersona);
pstm.setString(2, "Luke " + idPersona);
pstm.setString(3, "Sky " + idPersona);
pstm.setDate(4, new Date(Calendar.getInstance().getTimeInMillis()));
pstm.executeUpdate();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}

No hay comentarios: