Foros del Web » Programación para mayores de 30 ;) » Java »

actualizacion invisible

Estas en el tema de actualizacion invisible en el foro de Java en Foros del Web. Hola, estoy realizando una pequeña aplicacion como tema de base de datos para la UN, se trata de un formulario para registrar clientes nuevos y ...
  #1 (permalink)  
Antiguo 12/02/2011, 16:25
 
Fecha de Ingreso: abril-2008
Mensajes: 7
Antigüedad: 16 años, 6 meses
Puntos: 0
actualizacion invisible

Hola, estoy realizando una pequeña aplicacion como tema de base de datos para la UN, se trata de un formulario para registrar clientes nuevos y luego buscarlos para actualizar algunos datos que hayan faltado.

La conexion a MySQL se realiza con exito, al igual que el guardado de los datos y la busqueda. La busqueda la filtro por nombre. Para cada paso hay un metodo, es decir un metodo para la conexion que es llamado desde el constructor de la clase, un metodo para busqueda, un metodo para guardar y otro para la actualizacion y a cada metodo lo llamo con un boton: Busqueda, Actualizar y guardar.

Cuando quiero cambiar cualquier dato del formulario: nombre direccion o correo electronico, primero realizo la busqueda, luego digito en su campo de texto, al momento de dar click en actualizar, dispongo los resultado en una area de texto y y el programa me dice "datos actualizados" pero chequeo la base para ver si se actualizo y todo sigue igual. No se ve ningun error y la compilacion se hace correcta, enctonces no entiendo que este fallando ya que supestamente actualiza pero los resultados directo en la base de datos no se ven.

Publico parte del codigo, cualquier ayudo estare agradecido.



////conexion a labase de datos////////////////////
private void entrarbdt(){
try {

Class.forName("com.mysql.jdbc.Driver");
conectar = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/nuevosclientes","root", "7713gil");
Statement stm = conectar.createStatement();
guardar = conectar.prepareStatement("INSERT INTO clientes (id,empresa,contacto,telefono,direccion,mail,ciuda d,clasificacion) values(?,?,?,?,?,?,?,?)");
busque = conectar.prepareStatement("SELECT * FROM clientes ");
actua = conectar.prepareStatement("UPDATE clientes SET empresa= ?,"+"contacto= ?,"+"telefono= ?,"+"direccion= ?,"+"mail= ?,"+"ciudad= ?,"+"clasificacion= ?"+" WHERE id= ?");

}
catch (Exception e) {
e.printStackTrace();
}

}


////////////////////////////////////////actualizacion//////////////////////////////////////////////////////////////

private void actualizacion() {
Object[] acto = {campoNombre.getText(),contacto=campoContacto.getT ext(),campoTelefono.getText(),campoDireccion.getTe xt(),campoMail.getText(),campoCiudad.getText(),cam poClasifi.getText()};

try
{
nombre=campoNombre.getText();
contacto=campoContacto.getText();
dire=campoDireccion.getText();
telefo=campoTelefono.getText();
mail=campoMail.getText();
ciudad=campoCiudad.getText();
clasifi=campoClasifi.getText();



///////////////////////////////////////////////


for (int i = 0; i <= acto.length-1; i++) {

if (acto[i].toString().isEmpty()) {
JOptionPane.showMessageDialog(dialogo, "Faltan campos por llenar!!!", "Ventana Error Datos", JOptionPane.ERROR_MESSAGE);
return;
}
}
if(!validateMail(mail)){
JOptionPane.showMessageDialog(null, "Correo no valido!!!", "Ventana Error Datos", JOptionPane.ERROR_MESSAGE);
return;
}

actua.setString(8, clasifi);
actua.setString(2, nombre);
actua.setString(3, contacto);
actua.setString(4, telefo);
actua.setString(5, dire);
actua.setString(6, mail);
actua.setString(7, ciudad);
actua.setString(1,"0" );
actua.executeUpdate();


estado.setText("Resultado "+"Actualizacion de datos");
campoContacto.setText("");
campoNombre.setText("");
campoDireccion.setText("");
campoTelefono.setText("");
campoMail.setText("@");
campoCiudad.setText("");
campoClasifi.setText("");
resultado.setText("Nombre: " + nombre + "\n" +"Contacto: "+contacto+"\n"+"Telefono: "+telefo+"\n"+"Direción: "+dire+"\n"+"Correo Electronico: "+mail+"\n"+"Ciudad: "+ciudad+"\n"+"Clasificación: "+clasifi+"\n\n\n"+"Los datos se han \nActualizado! ");

}


catch (SQLException e) {
e.printStackTrace();
}

}
  #2 (permalink)  
Antiguo 12/02/2011, 23:41
 
Fecha de Ingreso: febrero-2011
Mensajes: 27
Antigüedad: 13 años, 9 meses
Puntos: 1
Respuesta: actualizacion invisible

No estoy seguro pero me temo que el problema que tienes es porque estás mezclando el Statement y el PreparedStatement, te diría que pruebes a crear las sentencias de la siguiente forma:

PreparedStatement guardar = conectar.prepareStatement("INSERT INTO clientes (id,empresa,contacto,telefono,direccion,mail,ciuda d,clasificacion) values(?,?,?,?,?,?,?,?)");
PreparedStatement busque = conectar.prepareStatement("SELECT * FROM clientes ");
PreparedStatement actua = conectar.prepareStatement("UPDATE clientes SET empresa= ?, contacto= ?, telefono= ?, direccion= ?, mail= ?, ciudad= ?, clasificacion= ? WHERE id= ?");

Como bien has hecho en guardar, el PreparedStatement gestiona los tipos de datos a posteriori cuando estás realizando "actua.setString(i, value)", por tanto no necesitas manejar ni comillas para cadenas ni comas para separar valores. Si aún así no se lo traga, te diría que probases en el phpmyadmin o el DBMS que estés utilizando a realizar la consulta a pelo a ver si se la traga o estás teniendo problemas de tipos...
  #3 (permalink)  
Antiguo 15/02/2011, 16:38
 
Fecha de Ingreso: abril-2008
Mensajes: 7
Antigüedad: 16 años, 6 meses
Puntos: 0
Respuesta: actualizacion invisible

Hola carlos , gracias por responder y exponer tus observaciones, de las cuales revise y modifique todo nuevamente y no se ha solucionado el problema en cuestion.

los:
private PreparedStatement guardar;
private PreparedStatement actua ;
private PreparedStatement busque ;
private ResultSet resu;

estan definidos al inicio de la clase, y no los tengo por cada metodo, que seria lo que haria cada uno:
conectar, guardar, consultar y actualizar.

Ya revise los parametros de Mysql y estan bien.
El formulario conecta, guarda y consulta; y en este ultimo consulto cualquier nombre y en las misma celdas o campos de texto me aparecen los datos con los que inicialmente fueron guardados, siendo esto la base para modificar cualquier dato del formulario.

Lo que busco es que al consultar un registro el que sea, en esa posicion, pueda modificar cualquier dato del formulario, es decir si por ejemplo busco a maria, pueda modifcar su telefono, direccion, email, y clasificacion.


Nuevamente agradezco tu tiempo y respuesta,

saludos y gracias
  #4 (permalink)  
Antiguo 16/02/2011, 01:21
 
Fecha de Ingreso: febrero-2011
Mensajes: 27
Antigüedad: 13 años, 9 meses
Puntos: 1
Respuesta: actualizacion invisible

Entiendo entonces que consigues recuperar correctamente la información de la base de datos y el problema te surge, a la hora de actualizar, para poder decir a la BD cual es exactamente el cliente que quieres modificar... Si es esto lo que tienes en mente veamos... tu recuperas la información, pongamos, de la empresa Coca-Cola, y rellenas los JTextField con la información obtenida, también tendrás que almacenar, aunque no lo muestres, el ID que corresponde a Coca-Cola y cuando pulses en el botón de "Actualizar" se deberá lanzar una consulta a la DB con los valores que recuperas de los JTextField y la ID que tendrás almacenada tú... Una cosa que estoy viendo extraña es que la ID la estás poniendo como String... ¿en la DB la tienes puesta como Varchar la id? ¿No sería más lógico que fuese un entero con autoincremento? Quizás he aquí el problema, realmente tienes que sea un entero y tú le estás pasando un String, debiendo hacer actua.setInt(1, 0 ); en vez de actua.setString(1,"0" );

Pruebalo a ver si, despue´s de todo el rollo que hemos soltao, era solo eso :P
  #5 (permalink)  
Antiguo 18/02/2011, 11:24
 
Fecha de Ingreso: abril-2008
Mensajes: 7
Antigüedad: 16 años, 6 meses
Puntos: 0
Respuesta: actualizacion invisible

hola CarlosAP, gracias nuevamente por responder, pero al fin ya se pudo solucionar la actualizacion:

Del metodo que hacia la conexion:

////conexion a labase de datos////////////////////
private void entrarbdt(){
try {

Class.forName("com.mysql.jdbc.Driver");
conectar = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/nuevosclientes","root", "7713gil");
Statement stm = conectar.createStatement();
guardar = conectar.prepareStatement("INSERT INTO clientes (id,empresa,contacto,telefono,direccion,mail,ciuda d,clasificacion) values(?,?,?,?,?,?,?,?)");
busque = conectar.prepareStatement("SELECT * FROM clientes ");
actua = conectar.prepareStatement("UPDATE clientes SET empresa= ?,"+"contacto= ?,"+"telefono= ?,"+"direccion= ?,"+"mail= ?,"+"ciudad= ?,"+"clasificacion= ?"+" WHERE id= ?");

}
catch (Exception e) {
e.printStackTrace();
}

}

quite la linea que actualiza es decir:

actua = conectar.prepareStatement("UPDATE clientes SET empresa= ?,"+"contacto= ?,"+"telefono= ?,"+"direccion= ?,"+"mail= ?,"+"ciudad= ?,"+"clasificacion= ?"+" WHERE id= ?");

y le agregue la posicion del id es decir:

actua = conectar.prepareStatement("UPDATE clientes SET empresa= ?,"+"contacto= ?,"+"telefono= ?,"+"direccion= ?,"+"mail= ?,"+"ciudad= ?,"+"clasificacion= ?"+" WHERE id= '"+resu.getInt("id")+"'");

porque esta posicion??

Resulta que al hacer la consulta o busqueda

despues del while

while(resu.next())

el primer parametro de busqueda es el id junto con los otros es decir:

resu.getInt("id");
resu.getString("empresa");
resu.getString("contacto");
resu.getString("telefono");
resu.getString("direccion");
resu.getString("mail");
resu.getString("ciudad");
resu.getString("clasificacion");

esto lo hago con el fin de imprimir los resultados del dato buscado con el nombre dado por la busqueda.

adicional antes de ejecutar la actualizacion

actua.executeUpdate();

se definen los datos de entrada ya modificados para actualizar:
actua.setString(1, nombre);
actua.setString(2, contacto);
actua.setString(3, telefo);
actua.setString(4, dire);
actua.setString(5, mail);
actua.setString(6, ciudad);
actua.setString(7, clasifi);

en el codigo anterior incluia el id desde 1, es decir:

actua.setInt(1,"0" ); error
actua.setString(2, nombre);
actua.setString(3, contacto);
actua.setString(4, telefo);
actua.setString(5, dire);
actua.setString(6, mail);
actua.setString(7, ciudad);
actua.setString(8, clasifi);

pero MySQL, informa que se actualizan 7 parametros y no 8 como le indico, ya que desde UPDATE ya se define id como parametro de ubicacion para actualizar, modifico el orden de la entrada de los datos, como lo indique antes, y de esta forma MySQL define la ubicacion y toma los datos de entrada modificados ubicandolos.


Saludos.

Etiquetas: invisible, actualizaciones
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:18.