problemas al editar datos de varias tablas a la ves.
hola a todos, estoy haciendo un programa para una pequeña prepaga y me surgió un problema que me viene llevando dolor de cabeza hace días.
bueno primero les cuento que no me tira ningún stacktrace del error. asi que es medio complicado encontrar la falla en si.
así que ice esta imagen para explicarles un poco mejor
http://subefotos.com/ver/?5d5bf432cfa1ac6a5c4bf5716f060ab4o.png
en la imagen van a ver que hay 2 cuadros de color verde los cuales al darle al botón modificar me permite guardar los datos que modifique, pero no me guarda los datos que modifique en el cuadro de color rojo.
este es el código del botón modificar.
btnInicio.setFont(new Font("Tahoma", Font.BOLD | Font.ITALIC, 16));
btnInicio.setBounds(859, 296, 121, 29);
contentPane.add(btnInicio);
JButton button_1 = new JButton("Modificar");
button_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
try {
Connection conexion = DB.conectarA("C:/ultramed/ultramed.db");
Statement comando=conexion.createStatement();
int alta1 = comando.executeUpdate("update alta1 set txtap1='" + txtap1.getText() + "' , txtno1='" + txtno1.getText() + "' , txtfn1='" + txtfn1.getText() + "', con1='" + con1.getSelectedItem() + "' , txtd1='" + txtd1.getText() + "' , txtna='" +txtna.getText() + "' , txtcp='" + txtcp.getText() + "' ,txtoc='" + txtoc.getText() + "' , txtlo='" + txtlo.getText() + "' ,txtdo='" + txtdo.getText() + "' ,txtn='" + txtn.getText() + "' ,txtdp='" + txtdp.getText() + "' ,txtba='" + txtba.getText() + "' ,txttel='" + txttel.getText() + "' ,txtg='" + txtg.getText() + "' ,txtemail='" + txtemail.getText() + "',conp='" + conp.getSelectedItem() + "',txtcu='" + txtcu.getText() + "',alt1='" + alt1.getSelectedItem() + "' where txtpo="+txtpo.getText());
if (alta1==1) {
}else{
int alta2 = comando.executeUpdate("update alta2 set txtap2='" + txtap2.getText() + "', txtno2='" + txtno2.getText() + "', txtfn2='" + txtfn2 .getText() + "', com2='" + com2.getSelectedItem() + "' , txtd2='" + txtd2.getText() + "' ,alt2='" + alt2.getSelectedItem() + "' where txtpo2="+txtpo.getText());
if (alta2==1) {
int alta3 = comando.executeUpdate("update alta3 set txtap3='" + txtap3.getText() + "', txtno3='" + txtno3.getText() + "', txtfn3='" + txtfn3 .getText() + "', com3='" + com3.getSelectedItem() + "' , txtd3='" + txtd3.getText() + "' ,alt3='" + alt3.getSelectedItem() + "' where txtpo3="+txtpo.getText());
if (alta3==1) {
int alta4 = comando.executeUpdate("update alta4 set txtap4='" + txtap4.getText() + "', txtno4='" + txtno4 .getText() + "', txtfn4='" + txtfn4 .getText() + "', com4='" + com4.getSelectedItem() + "' , txtd4='" + txtd4.getText() + "' ,alt4='" + alt4.getSelectedItem() + "' where txtpo4="+txtpo.getText());
if (alta4==1) {
int alta5 = comando.executeUpdate("update alta5 set txtap5='" + txtap5.getText() + "', txtno5='" + txtno5 .getText() + "', txtfn5='" + txtfn5 .getText() + "', com5='" + com5.getSelectedItem() + "' , txtd5='" + txtd5.getText() + "' ,alt5='" + alt5.getSelectedItem() + "' where txtpo5="+txtpo.getText());
if (alta5==1) {
int alta6 = comando.executeUpdate("update alta6 set txtap6='" + txtap6.getText() + "', txtno6='" + txtno6 .getText() + "', txtfn6='" + txtfn6 .getText() + "', com6='" + com6.getSelectedItem() + "' , txtd6='" + txtd6.getText() + "' ,alt6='" + alt6.getSelectedItem() + "' where txtpo6="+txtpo.getText());
if (alta6==1) {
int alta7 = comando.executeUpdate("update alta7 set txtap7='" + txtap7.getText() + "', txtno7='" + txtno7 .getText() + "', txtfn7='" + txtfn7 .getText() + "', com7='" + com7.getSelectedItem() + "' , txtd7='" + txtd7.getText() + "' ,alt7='" + alt7.getSelectedItem() + "' where txtpo7="+txtpo.getText());
if (alta7==1) {
}
}
}
}
}
}
}JOptionPane.showMessageDialog(null,"El cliente fue modificado");
}
catch(SQLException e){
e.printStackTrace();
}
}
});
button_1.setForeground(Color.RED);
button_1.setFont(new Font("Tahoma", Font.BOLD | Font.ITALIC, 16));
button_1.setBounds(704, 296, 121, 29);
contentPane.add(button_1);
}
}
- Inicie sesión o regístrese para enviar comentarios
Por dónde empezar...
Primero que nada, NO CONCATENES SQL. Nunca. NO CONCATENES SQL. Utiliza PreparedStatements parametrizados. NO CONCATENES SQL.
Si no sabes por qué, simplemente pon esto como valor en uno de tus campos:
'; DROP TABLE alta1; --
Y dile adiós a tu tabla
alta1
.Segunda, deberías usar un statement para cada update. Estás usando el mismo statement para todos los updates, tal vez de ahí viene el problema, porque los objetos de statements guardan estado.
Formato Codigo
Utiliza PreparedStaments y por favor agrega tu codigo entre tags
para que lo podamos leer mejor.
Transacción
Finalmente, qué pasa si uno de los updates falla? Está bien que los que pasaron antes dejen sus cambios? O hay alguna regla que diga que deben pasar todos, o ninguno?
Porque si tienen que pasar todos o ninguno, entonces debes además realizar todos los updates dentro del contexto de una transacción en base de datos, para que si falla uno, hagas rollback y entonces no se aplique ninguno de los cambios.
hola gracias por responder ya
hola gracias por responder ya e probado con diferentes Statement y me pasa igual.
lo que me llama la atencion es que alta1 y alta 2 si me los gurada pero el resto no.
es desir hasta esta parte del codigo si anda.
Connection conexion = DB.conectarA("C:/ultramed/ultramed.db");
Statement comando=conexion.createStatement();
int alta1 = comando.executeUpdate("update alta1 set txtap1='" + txtap1.getText() + "' , txtno1='" + txtno1.getText() + "' , txtfn1='" + txtfn1.getText() + "', con1='" + con1.getSelectedItem() + "' , txtd1='" + txtd1.getText() + "' , txtna='" +txtna.getText() + "' , txtcp='" + txtcp.getText() + "' ,txtoc='" + txtoc.getText() + "' , txtlo='" + txtlo.getText() + "' ,txtdo='" + txtdo.getText() + "' ,txtn='" + txtn.getText() + "' ,txtdp='" + txtdp.getText() + "' ,txtba='" + txtba.getText() + "' ,txttel='" + txttel.getText() + "' ,txtg='" + txtg.getText() + "' ,txtemail='" + txtemail.getText() + "',conp='" + conp.getSelectedItem() + "',txtcu='" + txtcu.getText() + "',alt1='" + alt1.getSelectedItem() + "' where txtpo="+txtpo.getText());
if (alta1==1) {
}else{
int alta2 = comando.executeUpdate("update alta2 set txtap2='" + txtap2.getText() + "', txtno2='" + txtno2.getText() + "', txtfn2='" + txtfn2 .getText() + "', com2='" + com2.getSelectedItem() + "' , txtd2='" + txtd2.getText() + "' ,alt2='" + alt2.getSelectedItem() + "' where txtpo2="+txtpo.getText());
if (alta1==2) {
Como dice eZamudio es
Como dice eZamudio es necesario implementar transacciones y ejecutar un rollback
Gracias por responder. Y cómo
Gracias por responder. Y cómo sería eso.
SQL concatenado
Sigues concatenando SQL. Tienes que arreglar eso, de verdad.
st.setString(1, "valor 1");
st.setTimestamp(2, timestamp2);
st.setBigDecimal(3, decimal3);
st.setLong(4, llave);
st.executeUpdate();
Que valores habia
Viendo la imagen los campos que no se actualizan no tienen nada, habia un valor antes, a lo mejor no hay ni datos en la BD para esos campos.
hola, gracias por responder
hola, gracias por responder si abia balores, y no me los modifica,
lo que me llama ami la tencion es que si yo pongo de esta forma no me deja guardar los datos en la segunda base de datos pero si de la primera.
Statement comando=conexion.createStatement();
int alta1 = comando.executeUpdate("update alta1 set txtap1='" + txtap1.getText() + "' , txtno1='" + txtno1.getText() + "' , txtfn1='" + txtfn1.getText() + "', con1='" + con1.getSelectedItem() + "' , txtd1='" + txtd1.getText() + "' , txtna='" +txtna.getText() + "' , txtcp='" + txtcp.getText() + "' ,txtoc='" + txtoc.getText() + "' , txtlo='" + txtlo.getText() + "' ,txtdo='" + txtdo.getText() + "' ,txtn='" + txtn.getText() + "' ,txtdp='" + txtdp.getText() + "' ,txtba='" + txtba.getText() + "' ,txttel='" + txttel.getText() + "' ,txtg='" + txtg.getText() + "' ,txtemail='" + txtemail.getText() + "',conp='" + conp.getSelectedItem() + "',txtcu='" + txtcu.getText() + "',alt1='" + alt1.getSelectedItem() + "' where txtpo="+txtpo.getText());
if (alta1==1) {
int alta2 = comando.executeUpdate("update alta2 set txtap2='" + txtap2.getText() + "', txtno2='" + txtno2.getText() + "', txtfn2='" + txtfn2 .getText() + "', com2='" + com2.getSelectedItem() + "' , txtd2='" + txtd2.getText() + "' ,alt2='" + alt2.getSelectedItem() + "' where txtpo2="+txtpo.getText());
if (alta2==1
pero si al final de la primer centencia de la primer base de datos le agrego un else.
if (alta1==1){
}else{
si me permite modificar la segunda base de datos y la primera.
pero ahora si pongo else en las demas no.
la verdad ya nose como hacer.
Sube tu código
Es dificil hacer un debug de este código, esta de mas decir que lo que estas haciendo no es para nada recomendable por motivos de seguridad y en casos de mantenibilidad ni hablar, lo que te recomiendo es que subas tu código a algun repositorio de github , para que los cientificos locos de javamexico podamos darle una manita de gato a eso, creo que deberias leer muchos libros ya que a futuro si alguien tiene que mantener eso pensará que odiabas al mundo.
Ademas un modelo de base de datos nunca deberia tener tablas como alta1, alta2 y alta3, si tienes algo como eso quiere decir que estas normalizando mal tu modelo, si tu modelo esta mal , todo lo de mas se vuelve fragil, muy propenso a errores y no resistente a cambios.
es la forma que me enseñaron
es la forma que me enseñaron de trabajar con bases dedatos.
se que estoy muy verde con el asunto de java, ya que soy muy nob estoy empesando todo esto.
lo que no entiendo el por que metad del codigo si anda y la otra mitad no. y la unica diferencia es un else
Sube el proyecto y lo revisaré este fin de semana
Sube el proyecto y lo revisaré este fin de semana, debe haber un error lógico, puede que el error esté ahí y no lo veas, por eso es bueno que una persona ajena le de una mirada.
Otra pregunta, ya debugeaste para asegurar que está ejecutando el statement?
Por ultimo puedes comprimirlo y enviarlo a mi e-mail marcos.roberto.lopez@gmail.com
Saludos.
Hola gracias por responder.
Hola gracias por responder. En un rato te paso el programa. Te aclaro que el programa está echo en eclipce. En el caso que no lo tengas te paso el programa eclipce también.
Mñe
Checa, a lo que se refiere @ezamudio es que deberías tener algo como:
PreparedStatement st = conexion.prepareStatement("UPDATE tabla SET col1=?, col2=?, col3=? WHERE llave=?");
st.setString(1, txt1.getText());
st.setString(2, txt2.getText());
st.setString(3, txt3.getText());
st.setString(4, txt4.getText());
int actualizado = st.executeUpdate(); //aqui ya tienes el valor de cuantos registros se actualizan
System.out.println("el actualizado es " + actualizado); //que numero te trae
if(actualizado >0){ //porque, en realidad te devuelve un 1? no te regresara mas registros? o
// de plano te regresa un cero, en cuyo caso primero comprueba tu primer insercion
PreparedStatement otrost = conexion.prepareStatement("UPDATE tabla2 SET col1=?, col2=?, col3=? WHERE llave=?");
otrost.setString(1, txt1.getText());
otrost.setString(2, txt2.getText());
otrost.setString(3, txt3.getText());
otrost.setString(4, txt4.getText());
int otroActualizado = otrost.executeUpdate();
// aqui ya tienes el oootro valor que bien deberias, como ultraminimo, pintarlo en pantalla para ver que numero te arroja
System.out.println("el otro actualizado es " + otroActualizado);
// cierras prepared statement
}
//cierras prepared statement, y connection
Algo así.
Aquí mis observaciones
He revisado el proyecto que compartiste, aqui mis observaciones.
1. He realizado una consulta a la base de datos, obteniendo los siguientes resultados.
Select * from alta1
id txtpo
3 11
1 12
6 12
7 12
9 20
... ...
Tienes más de un registro con txtpo=12
2. En la siguiente porción del código fuente
if (alta1==1) {
//continuas con las otras queries
}
El metodo executeUpdate te retorna un contador de las filas que fueron afectadas, cómo en la base de datos tienes 3 registros con txtpo=12, entonces alta=3 cuando ejecutas la query para txtpo=12. En este caso no se cumple if(alta == 1) y por lo tanto no se ejecutan las otras queries.
Recomendaciones
1. El campo txtpo debería ser unico en la base de datos
2. Cambia la condicion if(alta == 1) por if(alta > 0)
Roberto Lopez
http://marcosrobertos.blogspot.cl/
hola gracias por responder,
hola gracias por responder, pero le soy sincero no les entiendo a que se refieren.
soy muy nuevo en esto, el curso que ice de java lo ice atraves del municipio y solo duro 2 meses
Lee este libro cuando tengas tiempo
http://www.arquitecturajava.com/wp-content/uploads/ArquitecturaJava1.0Op...