none
Insertar valor si no existe en MySQL por medio de un Windows Form RRS feed

  • Debate general

  • amigos estoy con un modulo desarrollado que se conecta a una base de datos en mysql y actualmente lo que hago con el formulario windows form que tengo, es actualizar los registros que son iguales a lo que tengo en mi base de datos local a mi base de datos remota, me explico para ser mas claro, tengo registros en mi Sql Server en mi equipo local, y esos mismos los mando a actualizar a mi sitio web, actualmente me actualiza precio y stock de una tienda online con MySql, pero quiero actualizar este modulo y quiero que ahora cuando tenga en mi base de datos local un nuevo registro o producto para ser mas claro, lo inserte en mi tienda online, alguien me puede ayudar con agregar esta linea de comando, mas menos necesito una idea de como puede ser.

    este es una parte del codigo con el cual actualizo un campo en mi base de datos.

    Private Sub productoactivo()
            Using cn As New MySqlConnection("server=nombre_del_servidor; database=nombre_base_de_datos; user id=nombre_usuario; password=contraseña; port=numeropuertoxD;")
                cn.Open()
                Dim actualizar As String
                actualizar = "Update ps_product_shop Set active='" & TxtActivo.Text & "' WHERE price >='1'"
                Comando = New MySqlCommand(actualizar, cn)
                Comando.ExecuteNonQuery()
            End Using
        End Sub

    Gracias por la ayuda a quienes me den sus tip o ideas.

    Saludos!

    • Tipo cambiado Laura Ceglz jueves, 20 de octubre de 2016 21:56
    • Cambiado Enrique M. Montejo domingo, 6 de noviembre de 2016 8:10 Pregunta relacionada con el acceso a datos con MySql.
    domingo, 16 de octubre de 2016 6:25

Todas las respuestas

  • Hola:

    ¿A ver si consigo enterarme de lo que quieres?
    Tienes una base de datos (local) de SQL Server y una base de datos (remota) de MySQL
    ¿Cuantas tablas estan implicadas en dicho proceso?
    ¿En dicho proceso hay actualizaciones (Updates) e inserciones (Inserts)?

    Lo que me imagino es que tienes que ir leyendo registros de la(s) tabla(s) de la base de datos local; si existe en la base de datos remota, se actualiza y si no existe, se inserta.
    Una vez que se tenga claro el proceso, vendra el codigo para ejecutar dicho proceso

    Un saludo desde Bilbo
    Carlos

    domingo, 16 de octubre de 2016 7:21
  • Miguel Oyarzo,

    Una propuesta es vincular la instancia de SQL Server con una instancia de MySql, vincular ambas instancias permitirá ejecutar comandos que impacten en cualquiera de los nodos o en ambos, te recomiendo leas el siguiente artículo: HOWTO: Setup SQL Server Linked Server to MySQL. Una vez vinculado ambas instancias puedes implementar una consulta que actualice o inserte filas según la existencia del registro, para ello puedes hacer uso de MERGE (Transact-SQL) (en el argot de MySql a este procedimiento se le conoce como UPSERT).

    Todo el proceso mencionado podrías realizarlo OnDemand desde tu aplicación ejecutando un procedimiento almacenado, o podrías -según la edición de SQL Server- programarlo para que se ejecute en un determinado periodo de tiempo (como por ejemplo todos los días a las 5 am) mediante un paquete en SSIS o una consulta simple programada.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 16 de octubre de 2016 18:40
  • Exactamente J. Carlos, lo entendiste bien y explicaste bien también. 

    este es el proceso:

    Lo que me imagino es que tienes que ir leyendo registros de la(s) tabla(s) de la base de datos local; si existe en la base de datos remota, se actualiza y si no existe, se inserta.

    ¿Cuantas tablas estan implicadas en dicho proceso?

    En mi base de datos local es solo una tabla, en la base de datos remota ya entro a insertar valores en varias tablas.
    ¿En dicho proceso hay actualizaciones (Updates) e inserciones (Inserts)?

    Exactamente, hay actualizaciones e insert cuando son productos nuevos.

    • Editado Miguel Oyarzo domingo, 16 de octubre de 2016 20:33 corrección de respuesta.
    domingo, 16 de octubre de 2016 20:31
  • Amigo muchas gracias, esta interesante tu propuesta, de momento prefiero seguir utilizando los 2 módulos que tengo trabajando, ya que con uno actualizo los registros desde mis proveedores y con otro modulo (el cual busco mejorar con esta opción de agregarle el código de insertar nuevos registros) actualizo mi base de datos en mysql. por que de momento no lo hago así como me mencionas? pues porque utilizo una maquina virtual con poco procesador y memoria, y no quiero sobre-exigirla demasiado y que este lenta durante los periodos de visita de clientes en la tienda. Pero la opción que me mencionas si la tengo pensada para mas adelante cuando pueda contar con un servidor propio para alojar mi web. de casualidad me podrías ayudar con algun tip de como llegar a hacer este proceso del insert. Muchas gracias Williams.
    domingo, 16 de octubre de 2016 20:40
  • Miguel Oyarzo,

    Las filas de las tablas "locales" deberían tener una marca que establezca el estado, por ejemplo, si es un registro nuevo la marca podría ser 'I' (insert), si ya fue transferido la marca podría ser 'S' (sync) y si la fila se actualizó la marca podría ser 'U' (updated), sin dejar de lado las filas que fueron "eliminadas".

    La idea de lo dicho en el párrafo anterior es evitar el scan a las tablas 'origen' y 'destino' para validar si se requiere una actualización o inserción (fila por fila), de hecho imagino que para insertar los registros debes de cargar en memoria los datos origen y analizar la persistencia o no, podrías discriminar muchas filas si realizas la marca que propongo en el párrafo anterior.

    En caso no puedas implementar la columna de marca, y te re-uses a vincular servidores y a utilizar la instrucción MERGE para decidir inserción o actualización entonces lo común es que insertes según la existencia, por ejemplo:

    INSERT INTO dbo.TablaMySql (ID, Col1, Col2)
    SELECT @ID, @Valor1, @Valor2 
    WHERE NOT EXISTS (SELECT 1 FROM dbo.TablaMySql WHERE ID = @ID)


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 16 de octubre de 2016 22:43
  • ya realice parte del codigo Willams pero 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?


    miércoles, 2 de noviembre de 2016 6:27