Saltar al contenido
Underc0de /foro

guardar datos de JTable a MYSQL

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

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Avatar de REMHINOB
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,
WhatsApp Telegram

12 respuestas

Avatar de rommel360
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+"';

Avatar de rommel360
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];
}

Avatar de Solid Water
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,

Avatar de REMHINOB
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,

Avatar de Solid Water
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?

Avatar de REMHINOB
Cita de: Solid Water en Abril 23, 2019, 12:16:10 PM
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

Avatar de Solid Water
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.

Avatar de REMHINOB
Cita de: Solid Water en Abril 24, 2019, 09:20:19 AM
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

Avatar de REMHINOB
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,

guardar datos de JTable a MYSQL
Los enlaces son solo para miembros. Registrate o iniciá sesión

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

guardar datos de JTable a MYSQL
Los enlaces son solo para miembros. Registrate o iniciá sesión

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

Avatar de Solid Water
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,

Avatar de Solid Water
Prueba acá a donde declaras Conexion conexion:

guardar datos de JTable a MYSQL

poner Conexion conexion = new Conexion();

Saludos,

Avatar de REMHINOB
Cita de: Solid Water en Mayo 11, 2019, 05:57:56 PM
Prueba acá a donde declaras Conexion conexion:

guardar datos de JTable a MYSQL

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

¿Te quedó una duda sobre Dudas y pedidos generales?

Preguntala y te responde la comunidad (y el asistente Underc0de IA si nadie llega antes). Es gratis y tarda un minuto.

Ya tengo cuenta
Guardamos tu pregunta en este navegador: después de entrar la publicás con un clic.
Grupo de WhatsApp