guardar datos de JTable a MYSQL

Iniciado por REMHINOB, Abril 22, 2019, 02:09:27 PM

Tema anterior - Siguiente tema

0 Miembros y 2 Visitantes están viendo este tema.

Abril 22, 2019, 02:09:27 PM Ultima modificación: Abril 22, 2019, 02:38:58 PM por Gabriela
Hola Amigos otra vez yo, estoy modificando codigo de mi sistema para optimizarlo, ahora tengo un tabla con datos que deseo guardar en la base de datos, lo normal es hacer un bucle e ir guardando registro a registro abriendo y cerrando conexiones, quiero evitar esto asi que hice el siguiente codigo el cual crea una sentencia unica y posteriormente guardarlo:

evento= new Clases.Eventos();
        String sql="";
        for(int y=0;y<tbDespacho.getRowCount();y++){
            idmaterial=tbDespacho.getValueAt(y, 0)+"";//extraemos el codigo de material
            String stockactual=tbDespacho.getValueAt(y, 4)+""; //Extraemos el stock actual
            sql= sql + "Update base_material set stock_material= '"+stockactual+"' where id_material= '"+idmaterial+"';\n";
        }
        try{
            System.out.println(sql);
            evento.GuardaDatos(sql);
            System.out.println("Stock Descontado");
        }catch(Exception e){
            System.out.println(e);
        }
el codigo sql que genero al realizar el bucle fue este:

Update base_material set stock_material= '198.0' where id_material= '01010030004';
Update base_material set stock_material= '693.0' where id_material= '01010050015';
Update base_material set stock_material= '850.0' where id_material= '01010060001';

Al intentar guardar esa consulta me genera un error en la sintaxis, probe con salto de linea e igual. Me pueden ayudar por favor?? gracias de antemano
la clase evento.GuardarDatos es simplemente conectarse a la base de datos y ejecutar la sentencia sql,

yo utilizo Vectores. recorro la tabla y lo guardo en una Matriz de Vector (creo q un ArrayList tambien debe de funcionar).

luego esa matriz vector la envio a la funcion que se encargara de actualizar los datos. Luego recorre ese Vector y lo voy ejecutando la sentencia SQL  Update.

parecido a lo que haces en el for

Update base_material set stock_material= '"+stockactual+"' where id_material= '"+idmaterial+"';

y creo que tu error es por que la variable sql es igual a

todo esto junto

sql=Update base_material set stock_material= '198.0' where id_material= '01010030004';
Update base_material set stock_material= '693.0' where id_material= '01010050015';
Update base_material set stock_material= '850.0' where id_material= '01010060001';

y a la hora de hacer el update con esta variable pos como vez, estas enviando como un todo y no un Update por Update.

a si que lo que tendrias que hacer ahora es dividir esa cadena con la funcion Split(";"). //puse ; por q vi que es lo que comparten los 3 updates y quiero que donde encuentre un ; los separe a si podremos tener todo la sentencia update completa .
Update base_material set stock_material= '850.0' where id_material= '01010060001',
Update base_material set stock_material= '693.0' where id_material= '01010050015',
Update base_material set stock_material= '850.0' where id_material= '01010060001'

algo asi sql.split(";") esto te regresaria un arreglo de 3 posiciones en donde en cada posicion estaria ahora si un update.

ejemplo

String updates[] = sql.split(";")

ahora lo podrias meter en un for

for(int indice=0;indice < updates.length;indice++)
{
ejecuta la setencia update que esta en la posicion updates[indice];
}

Abril 22, 2019, 05:12:23 PM #3 Ultima modificación: Abril 22, 2019, 05:42:19 PM por Solid Water
Estas seguro que el id es un alfanúmerico y no un int?
por que lo pones entre comillas simples.

Prueba conectarte a mysql por la consola y realizar un update a mano a ver si es correcto.

mysql -u root -p

En linux.
suponiendo que tu usario de mysql es root.

Saludos,

Gracias a todos por responder, rommel360, gracias por tu respuesta, esta bien pero lo que quiero es evitar un bucle que se abra y se cierre las conexiones para realizar la actualizacion registro a registro, lo que pense en crear en una sola sentencia (concatenar los updates) y al final solo abrir una conexion y actualizar todo es una vez, se puede hacer eso??? o necesariamente tengo que ir actualizando registro a registro,?? esto es porque estoy trabajando con un hosting y servidor mysql remoto y lei que se tiene que evitar abrir y cerrar demasiadas conexiones para no hacer lento el sistema,

Me confunde un poco lo que dices de
Citar
la clase evento.GuardarDatos es simplemente conectarse a la base de datos y ejecutar la sentencia sql.
La clase o el método?
Por que luego dices:
Citar
esta bien pero lo que quiero es evitar un bucle que se abra y se cierre las conexiones

Verdad que tienes tu objeto conexion como static y lo reutilizas y no abres y cierras la conexion por cada consulta no?

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Me confunde un poco lo que dices de
Citar
la clase evento.GuardarDatos es simplemente conectarse a la base de datos y ejecutar la sentencia sql.
La clase o el método?
Por que luego dices:
Citar
esta bien pero lo que quiero es evitar un bucle que se abra y se cierre las conexiones

Verdad que tienes tu objeto conexion como static y lo reutilizas y no abres y cierras la conexion por cada consulta no?


carambas, mira soy nuevo en esto, me puedes dar un link o un ejemplo respecto a reutilizacion de conexiones, gracias de antemano

Abril 24, 2019, 09:20:19 AM #7 Ultima modificación: Abril 24, 2019, 02:36:22 PM por Solid Water
Un ejemplo sería algo así:

Código: java
public static class Querys
{
    public static Connection conn;

    public static void CreaConexion() {
       /*ACA creas la conexion al objeto conn que declaraste arriba*/
   }

}


Haces al comienzo del programa el Querys.CreaConexion() (getConnection al objecto statico), y luego reutilizas siempre ese objeto, en lugar de crearlo nuevamente y conectarlo.
Las clases staticas pueden ser accedidas sin ser instanciadas, tanto sus métodos como sus datos miembros públicos.
El objeto conexion statico mantendrá sus propiedades a lo largo del programa podrás llamarlo desde cualquier formulario.

Al principio del programa:

Querys.CreaConexion();

Querys.conn para usar el objeto desde cualquier formulario.

Recuerda que no tienes que hacerle un new a la clase Querys para crear el objeto, no debes instanciar la clase, llamas al método como nombreDeClase.Funcion();      (  Querys.CreaConexion();  )

Saludos, cualquier problema consulta.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Un ejemplo sería algo así:

Código: java
public static class Querys
{
    public static Connection conn;

    public static void CreaConexion() {
       /*ACA creas la conexion al objeto conn que declaraste arriba*/
   }

}


Haces al comienzo del programa el Querys.CreaConexion() (getConnection al objecto statico), y luego reutilizas siempre ese objeto, en lugar de crearlo nuevamente y conectarlo.
Las clases staticas pueden ser accedidas sin ser instanciadas, tanto sus métodos como sus datos miembros públicos.
El objeto conexion statico mantendrá sus propiedades a lo largo del programa podrás llamarlo desde cualquier formulario.

Al principio del programa:

Querys.CreaConexion();

Querys.conn para usar el objeto desde cualquier formulario.

Recuerda que no tienes que hacerle un new a la clase Querys para crear el objeto, no debes instanciar la clase, llamas al método como nombreDeClase.Funcion();      (  Querys.CreaConexion();  )

Saludos, cualquier problema consulta.

Hola SW gracias por responder, sin caer pesado, me podrias dar mas alcancer de como seria la clase "Querys", gracias otra vez

Mayo 11, 2019, 09:04:16 AM #9 Ultima modificación: Mayo 11, 2019, 09:44:57 AM por REMHINOB
SW esta es la imagen de mi clase conexion, cambie lineas basandome en tu ejemplo y conecta, me esta volviendo loco,


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Aqui mi Clase gestion con el cual guardo y extraigo datos de mi BD


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Al ejecutar el sistema me sale error, si me puedes dar una mano por favor, gracias
Gracias

Hola, lo que yo veo en tu code es que:

tienes una public class conexion y adentro tienes el objecto static connection.

Luego en GestionDatos, dices que la variable llamada "conexion" será del tipo conexion.

y luego la utilizas así:

conexion.getConnection();

Pero en ningún momento hiciste el conexion = new conexion(); no instanciaste la clase ni la definiste como static para usar sus metodos sin instanciarla, nunca llamaste a su constructor por lo que tampoco nunca se creo la conexion que luego quieras preparar statement, por lo que creo que si el problema es ese, tienes 2 caminos: o declaras la clase  conexion y todos sus métodos como static y no usas un objeto si no que puedes llamar sus metodos directamente con el nombre de la clase, o le haces un new para instanciar el objeto el cual llamará al constructor y se creará la conexion.

La otra sería que hayas instanciado conexion usando this.conexion = new conexion(); en alguna parte de la clase GestionDatos que no me mostraste el code, por eso siempre hay que intentar mostrar todo lo que se pueda.

Saludos,

Prueba acá a donde declaras Conexion conexion:



poner Conexion conexion = new Conexion();

Saludos,

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Prueba acá a donde declaras Conexion conexion:



poner Conexion conexion = new Conexion();

Saludos,

SOLIDW una pregunta, mira al crear una clase conexion estatica como en la imagen y al crear una clase actualizar datos el cual llamaria a la clase conexion, pero si tengo datos en una jtable y quiero leer los datos de ese Jtable y actulizar los valores en  una tabla de mysql tendria que crear un bucle con for(){} que me recorra la tabla y actulize los datos, ahora mi pregunta es como serian las lineas de la clase actualizar para no ir abriendo y cerrando conexiones con cada registro actualizado?? gracias