entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

¿Cómo realizar una consulta Select antes de Insertar en una tabla?

Buenas tardes a todos.
Intento hacer una clase en Java que me permita realizar una consulta SELECT en una tabla específica para
verificar si la información de algún registro existe a través de un ID (cédula) específico, es decir, Si yo tengo una cédula "000005524937284"
dentro de la base de datos,no se insertará esta información, en caso contrario, realice una inserción en la tabla seleccionada
agregando en este caso: La cédula, el nombre, y la clave CLUES.

El código que he desarrollado es éste.

package Controlador;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Connection;
/**
 * @author Pedro Ramos Millán-Universidad Tecnológica de Tecámac
 */
public class ConsultaCedula {    
    Connection conmed=null;   
    public boolean realizarConsulta(String xClues,String xCedula, String xNombre,String conexion){//Recibo los parámetros clues, cedula, nombre, conexión

            try{                
                    conmed=Controlador.Conexion.conectar(conexion);//Establezco la conexión con access
                    Statement estamed=conmed.createStatement();
                        ResultSet rsMedicos=estamed.executeQuery("select cedula from medicos where cedula='"+xCedula+"'");//Consulta Select

                               while(!rsMedicos.next()){//Mientras no hayan siguientes

                            String insertarMedicos="insert into medicos(clues,cedula, nombremed) values(?,?,?)";//Sintáxis de inserción

                                PreparedStatement pstaMed=conmed.prepareStatement(insertarMedicos);
                                pstaMed.setString(1,xClues);
                                pstaMed.setString(2,xCedula);
                                pstaMed.setString(3,xNombre);

                                conmed.commit();

                          return true;

                           }
                               conmed.close();
    } catch(Exception er){
    er.printStackTrace();
    return false;    
}
            return false;
    }
    public static void main(String[]ar){

    ConsultaCedula con=new ConsultaCedula();

    String conexion="C:\\SAEH\\Datos\\SAEH1415.mdb";
    String clues="MCSSA018774";
    String nombre="José Pérez Estrada";
    String cedula="552493728400000";

    if(con.realizarConsulta(clues, cedula,nombre, conexion)){
        System.out.println("Insertado");
    }else{
        System.err.println("No Insertado");
    }

    }
}

¿Existe otra forma de hacer esta validación?

bl4z3r comentado Nov 26, 2015

Discúlpame, pero no entendí nada a lo que querías ir. ¿Podes reformular tu problema?

pWolfman_furry29 comentado Nov 26, 2015

Lo que quiero hacer es primero recuperar un ID(Cédula) para realizar una consulta Select.

select cedula from médicos where cedula='000005524937284'

Si al realizar esta consulta, la cédula introducida existe, retorne un booleano verdadero, en caso contrario, realice la inserción en la tabla MÉDICOS recuperando el ID(cédula), el nombre del médico, y la clave Clues.

Insert into medicos (clues,cédula,nombremed) values('MCSSA018774','000005524937284','José Pérez Estrada');

Muchas gracias por responder @bl4z3r :)

2 Respuestas

3votos

MitsuGami Puntos8010

Primero crea una clase que abstraiga los datos de la conexión a la base de datos:

public class DBUtils {
    private static final String HOST = "jdbc:mysql://localhost:3306/";
    private static final String USER = "root";
    private static final String PASS = "tupass";
    private static final String DB = "tubbdd";

    public static Connection connect() {
        Class.forName("com.mysql.jdbc.Driver");
        return DriverManager.getConnection(HOST + DB, USER, PASS);
    }
}

Luego, una capa de abstracción para el acceso a datos:

public class SimpleDao {

    public boolean existeCedula(String cedula) {
        String sql = "SELECT cedula FROM Medicos WHERE cedula = ?";
        try(Connection conn = DBUtils::connect();
            PreparedStatement stmt = conn.prepareStatement(sql)) {

            stmt.setString(0, cedula);
            ResultSet rs = stmt.executeQuery();
            if(!rs.next()) {
                return false;
            } else {
                return true;
            }
        } catch(SQLException e) {
            Logger.getLogger(SimpleDao.class.getName())
                    .log(Level.SEVERE, "Error en consulta", e);
        }
    }

    public void insertar(String clues, String cedula, String nombreMedico) {
        String sql = "INSERT INTO Medicos(clues, cedula, nombremed) VALUES(?,?,?)";
        try(Connection conn = DBUtils::connect();
            PreparedStatement stmt = conn.prepareStatement(sql)) {

            stmt.setString(0, clues);
            stmt.setString(1, cedula);
            stmt.setString(2, nombreMedico);

            stmt.execute();

        } catch(SQLException e) {
            Logger.getLogger(SimpleDao.class.getName())
                    .log(Level.SEVERE, "Error en consulta", e);
        }
    }
}

Por último, utiliza la capa de abstracción para realizar las mismas operaciones pero a más alto nivel:

public static void main(String[] args) {
    SimpleDao dao = new SimpleDao();

    String cedula = JOptionPane.showInputDialog("Ingrese la cédula primero: ");

    if(dao.existeCedula(cedula)) {
        JOptionPane.showMessageDialog(null, "La cédula ya existe");
    } else {
        String clues = JOptionPane.showInputDialog("Ingrese el clues");
        String nombre = JOptionPane.showInputDialog("Ingrese el nombre del médico");
        dao.insertar(clues, cedula, nombre);
    }
}

pWolfman_furry29 comentado Nov 29, 2015

Gracias por tu respuesta @migamipe.

Me resulta funcional este código, aunque claro, en mi caso no estoy conectándome a MYSQL, sino que estoy conectándome a Access mediante ODBC.

El código final quedó de la siguiente forma:

package Controlador;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/**
 *
 * @author Pedro Ramos Millán- Respuesta de Entre Desarrolladoreas
 */
public class PowerValidaMedic {
    Connection conexion;
    public PowerValidaMedic(){}

    public PowerValidaMedic(Connection xConn){
    this.conexion=xConn;
    }
  public boolean existeCedula(String xCedula){  
    String sql="select cedula from medicos where cedula=?";

      try{        
        PreparedStatement psta=conexion.prepareStatement(sql);
        psta.setString(1,xCedula);
        ResultSet rs=psta.executeQuery();
            if(!rs.next()){
                return false;
            }else{
                 return true;
            }

    }catch(Exception er){
        er.printStackTrace();
        return false;
    }

}
  public void insertarMedico(String clues, String cedula, String nombremed){
      String insert="insert into medicos(clues,cedula,nombremed) values(?,?,?)";
      try{
      PreparedStatement psta=conexion.prepareStatement(insert);
         psta.setString(1, clues);
         psta.setString(2, cedula);
         psta.setString(3, nombremed);

         psta.execute();

         conexion.commit();
      }catch(Exception er){
      er.printStackTrace();
      }
  }
}

Y esta es la conexión:

package Controlador;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import javax.swing.JOptionPane;

public class Conexion {

public  static Connection conectar(String xPath) {
    /*Validación de archivo Access*/
    String extensionBD=xPath.substring(xPath.lastIndexOf("."));
    if(extensionBD.equals(".mdb")||extensionBD.equals(".accdb")){

    try {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + xPath;
        Connection conn = DriverManager.getConnection(url, "", "");

        System.out.println("Conexión Exitosa con la base "+xPath+" (Extensión: "+extensionBD+")"); 
        return conn;
    } catch (SQLException sql) {
        sql.printStackTrace();
        JOptionPane.showMessageDialog(null, "La Base de datos seleccionada está dañada, no es la base de datos del SAEH, "
                + "o no se encuentras los campos necesario para insertar, favor de verificar, ","Aviso de Base de datos",2);
        return null;
}   catch (ClassNotFoundException ex) {
        JOptionPane.showMessageDialog(null, "Error de conexión con Base de datos","Atención BD",0);
      return null;
    }
    }
    else{
    JOptionPane.showMessageDialog(null, "La extensión "+extensionBD+" no es válida. "
            + "Seleccione un archivo de base de datos válido");
        return null;
    }
}
}

MitsuGami comentado Nov 29, 2015

Qué bueno que te haya servido. Saludos.

2votos

bl4z3r Puntos16360

Estas haciendo un acercamiento incorrecto a tu problema por lo que veo. Tu lo que no quieres es insertar y que tengas células duplicadas.

Para evitar esto, desde la base de datos tiene que hacer algún de siguientes 2 cosas:

a. Crear un Clave Primaria sobre el Campo Celula.

ALTER TABLE Tabla1
ADD CONSTRAINT PK_NombrePK PRIMARY KEY (ColumnaPrimeria1)

b. Crear un restricción única y no nula sobre el campo Celula.

ALTER TABLE Tabla1
ADD CONSTRAINT UK_NombreUK UNIQUE (ColumnaUnica1)

Lo bueno que despues de haber hecho estos cambios en la base de datos, puede aprovechar lo agregado para hacer lo que quieres. Por ejemplo: Si vas a insertar un registro que ya esta en la base de datos, Java te lanzara un excepción del tipo SqlException, si no me equivoco. Y esta excepción la puedes manejar de la siguiente manera:

try
{
 // 1. Abro conexión.
 // 2. Empiezo transacción.
 // 3. Realizo inserción.
 // 4. Comprometo transacción.
 // 5. Cierro conexión.
 // 6. Retorno falso.
}
catch(SqlExpcetion sqlex)
{
 // Si existe el registro, hago un retorno con true.
}

Este es el acercamiento correcto para manejo de registros duplicado en DB desde un lenguaje de programación orientado a objetos. (El ejemplo fue adaptado para tus necesidades)

Espero que te haya ayudado.

pWolfman_furry29 comentado Nov 29, 2015

Estoy de acuerdo con tu punto de vista, inclusive lo he aplicado en otros casos, Sin embargo, no puedo modificar la estructura de esta base de datos, dado que causaría conflictos con el Sistema existente.

Indagando sobre este Sistema, entendí que esta restricción de unicidad era ocasionada por las relaciones entre las tablas EGRESO y MÉDICOs.

bl4z3r comentado Nov 30, 2015

@pWolfman_furry29 explícate un poco mas... Posiblemente se pueda llegar a una solución ideonea y de largo plazo para este problema de base de datos.

Por favor, accede o regístrate para responder a esta pregunta.

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


Otras Preguntas y Respuestas


Actividad Reciente

¿Eres Usuario Apple?

...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta