none
Como inserto registro a varias tablas mysql a la vez desde windows form?

    Pregunta

  • Les cuento que necesito insertar varios registros a MySql, esos valores van en distintas tablas y necesito insertarlos en una sola linea de código, pero estos son o pertenecen a un mismo producto en este caso, quiero lograr hacer de esa forma la inserción de valores, por ejemplo la consulta trae valores de estas tablas que en una consulta para mostrar los campos se relacionan con estas en la consulta:

    select * FROM	ps_product p INNER JOIN ps_product_lang pl ON p.id_product = pl.id_product LEFT JOIN " & _
                             " ps_supplier_lang sl ON p.id_supplier = sl.id_supplier LEFT JOIN " & _
                             " ps_manufacturer_lang ml ON p.id_manufacturer = ml.id_manufacturer LEFT JOIN " & _
                             " ps_stock_available sa ON sa.id_product = p.id_product

    estaba buscando en Internet pero lo que encontré manda las inserciones en base a la tabla, inserta en una tabla, luego en otra y otra y otra, pero no me gustaría trabajar así, sino en una consulta a ejecutar que inserte los valores desde mi windows form al mysql inmediatamente.

    espero por favor si me pueden dar un ejemplo sencillo de como realizarlo, utilizando quizás lo que deje en código aquí.

    gracias.


    • Editado Miguel Oyarzo lunes, 31 de octubre de 2016 5:36 corrección de explicación del problema
    lunes, 31 de octubre de 2016 5:34

Respuestas

  • No puedes insertar directamente a varias tablas en una base de datos. Así como el Select permite poner un Join de varias tablas, en cambio para hacer un insert es necesario poner un "Insert into tabla 1...", seguido de "Insert into tabla2..." y así sucesivamente en todas ellas. Esto no es una limitación del vb.net ni del Windows Form, sino del motor de base de datos.

    Si lo quieres escribir en vb en una sola sentencia, puedes enviar con dbcommad un comando que tenga las sentencias de inserción separadas por un punto y coma: "insert into tabla1...;insert into tabla2...". Pero ganarás muy poco en comparación con enviar las dos inserts con dos dbcommands. A efectos transaccionales, tanto en un caso como en el otro tendrías que rodear la operación de una transacción si es que necesitas que la inserción en las tablas sea monolítica.

    lunes, 31 de octubre de 2016 7:24

Todas las respuestas

  • No puedes insertar directamente a varias tablas en una base de datos. Así como el Select permite poner un Join de varias tablas, en cambio para hacer un insert es necesario poner un "Insert into tabla 1...", seguido de "Insert into tabla2..." y así sucesivamente en todas ellas. Esto no es una limitación del vb.net ni del Windows Form, sino del motor de base de datos.

    Si lo quieres escribir en vb en una sola sentencia, puedes enviar con dbcommad un comando que tenga las sentencias de inserción separadas por un punto y coma: "insert into tabla1...;insert into tabla2...". Pero ganarás muy poco en comparación con enviar las dos inserts con dos dbcommands. A efectos transaccionales, tanto en un caso como en el otro tendrías que rodear la operación de una transacción si es que necesitas que la inserción en las tablas sea monolítica.

    lunes, 31 de octubre de 2016 7:24
  • pasando a código como seria idealmente amigo?

    yo uso esto para hacer los insert al SQL Server pero como hablamos aqui lo hago en una tabla.

    Try
                    Conexion.Open()
                    Dim cmd As New SqlClient.SqlCommand
                    cmd.Connection = Conexion
                    cmd.CommandText = "INSERT INTO PRODUCTOS(CATEGORIA,PROVEEDOR,LINK,FECHAINGRESO,FECHAUPDATE,VISIBILIDAD,LINKACTIVO,DESCRIPCION)" & _
                    "VALUES (@CATEGORIA,@PROVEEDOR,@LINK,@FECHAINGRESO,@FECHAUPDATE,@VISIBILIDAD,@LINKACTIVO,@DESCRIPCION)"
    
                    cmd.Parameters.AddWithValue("@CATEGORIA", INcategoria)
                    cmd.Parameters.AddWithValue("@PROVEEDOR", INProveedor)
                    cmd.Parameters.AddWithValue("@LINK", INlink)
                    cmd.Parameters.AddWithValue("@FECHAINGRESO", INfechaingreso)
                    cmd.Parameters.AddWithValue("@FECHAUPDATE", INFechaactualizado)
                    cmd.Parameters.AddWithValue("@VISIBILIDAD", INFVisible)
                    cmd.Parameters.AddWithValue("@LINKACTIVO", INLinkActivo)
                    cmd.Parameters.AddWithValue("@DESCRIPCION", INDescripcion)
    
                    Dim Cont As Integer = 0
                    Cont = cmd.ExecuteNonQuery
    
                    If Cont = 1 Then
                        MessageBox.Show("El ingreso se ha realizado con exito")
                        'banderalink = "EDICION"
                        CargarGrilla()
                    Else
                        MessageBox.Show("NO SE PUDO GUARDAR EL INGRESO")
                    End If
    
                Catch ex As Exception
                    MessageBox.Show("Excepcion :" & ex.ToString)
                Finally
                    If Conexion.State = ConnectionState.Open Then Conexion.Close()
                    Conexion = Nothing
                End Try

    Para un INSERT en MYSQL debe ser lo mismo en lineas de códigos verdad pero por tablas distintas obviamente, esto significa que serán varias consultas?

    saludos

    lunes, 31 de octubre de 2016 18:05
  • Sí, lo de que sea una tabla o varias tablas, en principio da igual que sea en Mysql o en SQL Server, la diferencia es que en el código tendrás que cambiar el SqlConnection por un OleDbConnection si usas el driver de OleDb, o por un MysqlConnection si usas el proveedor nativo (y lo mismo con el SqlCommand). Ojo con los parámetros, que según el proveedor que uses cambian de formato.

    Si quieres usar dos comandos en el fuente, simplemente repites el código del ejemplo, es decir, vuelves a poner otro SqlCommand con la nueva Insert sobre la segunda tabla, vuelves a hacer todos los Add de los Parameters que tenga la segunda sentencia, y vuelves a llamar a ExecuteNonQuery. Y al final haces el Close de la conexión después de haber ejecutado los dos Commands.

    Si optas por juntar las dos inserts, entonces lo dejas como está, pero dentro de las comillas pones la primera insert seguida de un punto y coma seguida de la segunda insert. Cada una tendrá sus propios parámetros, con lo que la lista de Parameters.Add será más larga porque tendrás que añadir todos los parámetros de las dos inserts. Y al final, haces un único ExecuteNonQuery igual que está en el ejemplo.

    lunes, 31 de octubre de 2016 18:22
  • ya realice el codigo para insertar en las distintas tablas, pero en una de ellas al intentar insertar los campos en la tabla ps_product me arroja este tipo de error, lo que pienso es que puede ser porque la tabla ps_product tiene el campo id_product como id primario y es entero autoincrementable, debe de ser ese el problema verdad?

    que creen ustedes?

    miércoles, 2 de noviembre de 2016 6:28
  • Fíjate en el texto que sale en el error, donde dice que tienes un syntax error near... Verás que la sentencia que da el error tiene las comillas mal emparejadas. Revisa la sentencia y cerciórate de que cada dato va encerrado entre comillas y a continuación, fuera de las comillas, está la coma que lo separa del siguiente dato.
    miércoles, 2 de noviembre de 2016 8:04