none
CONSULTAR DOS TABLAS EN DIFERENTES BASES DE DATOS MYSQL DESDE VISUAL 2015 RRS feed

  • Pregunta

  • Muy buenos días tengan uds amigos del foro, hoy estoy acudiendo a uds por una consulta que tengo que desarrollar desde visual studio 2025 y no se como hacerla.

    Básicamente tengo dos bases de datos mysql en diferentes servidores, en cada base de datos existe la tabla productos, a la cual necesito consultar si todos los productos están en las tablas utilizo esta consulta y me funciona solo si cargo las tablas en una de las base por ejemplo:

    SELECT idProducto FROM productos_suc1 WHERE NOT EXISTS (SELECT idProducto FROM productos_suc2 WHERE productos_suc1.idProducto=productos_suc2.idProducto)

    Mi pregunta es, hay alguna forma que a esta consulta se le pueda agregar por ejemplo yo uso:

    server=xxxxxx.ddns.net;database=prueba;user id=xxxx;password=xxxxx;

    para conectarme a la base de datos remota, se puede usar esto en la consulta para comparar las esas tablas, y si no, me podrían dar una idea de como puedo hacer para solucionar este problema.

    Espero su ayuda amigos del foro, desde ya MUCHÍSIMAS GRACIAS!!!!!......

    viernes, 8 de mayo de 2020 12:33

Respuestas

  • Hola:

    Haces la consulta a la BD1 en el servidor1 con la cadena de conexion1 y el resultado lo guardas en el datatable1.
    Haces la consulta a la BD2 en el servidor2 con la cadena de conexion2 y el resultado lo guardas en el datatable2.
    Luego solo tienes que comparar el datatable1 con el datatable2

    Un saludo desde Bilbo
    Carlos
    viernes, 8 de mayo de 2020 14:35
  • Hola:
    Para el ejemplo he creado 2 DataTables desconectados
    El ejemplo tiene 2 soluciones cada una asociada a un boton

    En un Form como el de la imagen

    Copia y pega el siguiente codigo

    Option Explicit On
    Option Strict On
    Public Class Form3
        Private mdtTableA As New DataTable("TableA")
        Private mdtTableB As New DataTable("TableB")
        Private Sub Form3_Load(sender As Object, e As EventArgs) Handles Me.Load
            Try
                Dim lDataColumn As DataColumn
                lDataColumn = New DataColumn("id", GetType(Integer))
                mdtTableA.Columns.Add(lDataColumn)
                lDataColumn = New DataColumn("column", GetType(String))
                mdtTableA.Columns.Add(lDataColumn)
                'Carga de Datos
                Dim lDataRow As DataRow
                lDataRow = mdtTableA.NewRow
                lDataRow.Item("id") = 1
                lDataRow.Item("column") = "data1"
                mdtTableA.Rows.Add(lDataRow)
                '
                lDataRow = mdtTableA.NewRow
                lDataRow.Item("id") = 2
                lDataRow.Item("column") = "data2"
                mdtTableA.Rows.Add(lDataRow)
                '
                lDataRow = mdtTableA.NewRow
                lDataRow.Item("id") = 3
                lDataRow.Item("column") = "data3"
                mdtTableA.Rows.Add(lDataRow)
                '
                lDataRow = mdtTableA.NewRow
                lDataRow.Item("id") = 4
                lDataRow.Item("column") = "data4"
                mdtTableA.Rows.Add(lDataRow)
                Me.DataGridView1.DataSource = mdtTableA
                '
                lDataColumn = New DataColumn("id", GetType(Integer))
                mdtTableB.Columns.Add(lDataColumn)
                lDataColumn = New DataColumn("column", GetType(String))
                mdtTableB.Columns.Add(lDataColumn)
                'Carga de Datos
                lDataRow = mdtTableB.NewRow
                lDataRow.Item("id") = 1
                lDataRow.Item("column") = "data1"
                mdtTableB.Rows.Add(lDataRow)
                '
                lDataRow = mdtTableB.NewRow
                lDataRow.Item("id") = 3
                lDataRow.Item("column") = "data3"
                mdtTableB.Rows.Add(lDataRow)
                Me.DataGridView2.DataSource = mdtTableB
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
        Private Sub btnDataset_Click(sender As Object, e As EventArgs) Handles btnDataset.Click
            btnDataset.Enabled = False
            btnRecorrer.Enabled = False
            ComparaDataTables()
        End Sub
        Private Sub ComparaDataTables()
            Dim mdtTableC As New DataTable("TableC")
            Try
                'Debe usar un conjunto de datos para usar un objeto DataRelation
                Using DataSet As New DataSet()
                    'Agregar tablas
                    DataSet.Tables.AddRange(New DataTable() {mdtTableA.Copy(), mdtTableB.Copy()})
                    'Obtener columnas para la relación de datos
                    Dim ColumnasPrimera As DataColumn() = New DataColumn(DataSet.Tables(0).Columns.Count - 1) {}
                    For liCiclo As Integer = 0 To ColumnasPrimera.Length - 1
                        ColumnasPrimera(liCiclo) = DataSet.Tables(0).Columns(liCiclo)
                    Next
                    Dim ColumnasSegunda As DataColumn() = New DataColumn(DataSet.Tables(1).Columns.Count - 1) {}
                    For liCiclo As Integer = 0 To ColumnasSegunda.Length - 1
                        ColumnasSegunda(liCiclo) = DataSet.Tables(1).Columns(liCiclo)
                    Next
                    'Create DataRelation
                    Dim Relacion As New DataRelation(String.Empty, ColumnasPrimera, ColumnasSegunda, False)
                    DataSet.Relations.Add(Relacion)
                    'Crear columnas para la tabla de retorno
                    For liCiclo As Integer = 0 To mdtTableA.Columns.Count - 1
                        mdtTableC.Columns.Add(mdtTableA.Columns(liCiclo).ColumnName, mdtTableA.Columns(liCiclo).DataType)
                    Next
                    'Si la primera fila no está en la segunda, Agregar a la tabla de retorno.
                    mdtTableC.BeginLoadData()
                    For Each parentrow As DataRow In DataSet.Tables(0).Rows
                        Dim childrows As DataRow() = parentrow.GetChildRows(Relacion)
                        If childrows Is Nothing OrElse childrows.Length = 0 Then
                            mdtTableC.LoadDataRow(parentrow.ItemArray, True)
                        End If
                    Next
                    mdtTableC.EndLoadData()
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
            DataGridView3.DataSource = mdtTableC
        End Sub
        Private Sub btnRecorrer_Click(sender As Object, e As EventArgs) Handles btnRecorrer.Click
            btnDataset.Enabled = False
            btnRecorrer.Enabled = False
            'Clonar la estructura del datatable diferencia
            Dim mdtTableC As DataTable = mdtTableA.Clone
            Dim FilaC As DataRow
            For Each FilaA As DataRow In mdtTableA.Rows
                If Buscar(Convert.ToInt32(FilaA.Item("Id"))) = False Then
                    FilaC = mdtTableC.NewRow
                    FilaC.Item("id") = FilaA.Item("id")
                    FilaC.Item("column") = FilaA.Item("column")
                    mdtTableC.Rows.Add(FilaC)
                End If
            Next
            DataGridView3.DataSource = mdtTableC
        End Sub
        Private Function Buscar(vId As Integer) As Boolean
            Dim Retorno As Boolean = False
            Try
                Dim Consulta = From Valor In mdtTableB Where Valor.Field(Of Integer)("Id") = vId
                If Consulta.Count() > 0 Then
                    Retorno = True
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
            Return Retorno
        End Function
        Private Sub btnLimpiar_Click(sender As Object, e As EventArgs) Handles btnLimpiar.Click
            btnDataset.Enabled = True
            btnRecorrer.Enabled = True
            DataGridView3.DataSource = Nothing
        End Sub
    End Class

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta dj mac40 viernes, 15 de mayo de 2020 17:18
    sábado, 9 de mayo de 2020 7:47
  • Hola:
    El mensaje de error es "bastante claro"
    Te dice que algun datatable (dt o dt2) NO tiene ninguna columna.
    Tendras que revisar como se cargan esos 2 datatables

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta dj mac40 viernes, 15 de mayo de 2020 17:18
    lunes, 11 de mayo de 2020 18:18

Todas las respuestas

  • Hola dj mac40, 

      

    Gracias por levantar tu consulta en los foros de MSDN. Entendimos su pregunta y vamos a darle seguimiento para buscar la mejor repuesta pertinente al caso.  

    Cualquier duda referente a productos Microsoft, puedes consultarnos. Es un gusto informarte. 

    Gracias por usar los foros de MSDN.   

    Oystein Edwards 

     ____________________________ 

      

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.  

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.   

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft. 

    viernes, 8 de mayo de 2020 13:27
    Moderador
  • Hola:

    Haces la consulta a la BD1 en el servidor1 con la cadena de conexion1 y el resultado lo guardas en el datatable1.
    Haces la consulta a la BD2 en el servidor2 con la cadena de conexion2 y el resultado lo guardas en el datatable2.
    Luego solo tienes que comparar el datatable1 con el datatable2

    Un saludo desde Bilbo
    Carlos
    viernes, 8 de mayo de 2020 14:35
  • Muy buenas tardes amigo J. Carlos Herrero, Muchísimas Gracias por responder a mi pregunta.

    Te cuento que probé lo que me sugeriste en tu respuesta y realice una prueba piloto y si bien demora un poco por la velocidad de la conexion de internet me funciono perfecto use este codigo:

    Private Sub Cargar_Prod_Falt()
            Using conex As New MySqlConnection(Conex_BD.Conexion_Suc1)
                Using cmd As New MySqlCommand
                    cmd.CommandText = "SP_Cargar_Producto_Prueba"
                    cmd.CommandType = CommandType.StoredProcedure
                    cmd.Connection = conex
                    conex.Open()
                    Using da As New MySqlDataAdapter(cmd)
                        Using dt As New DataTable
                            da.Fill(dt)
                            DgvPrueba1.DataSource = dt

                            Using conex2 As New MySqlConnection(Conex_BD.Conexion_Local)
                                Using cmd2 As New MySqlCommand
                                    cmd2.CommandText = "SP_Cargar_Producto_Prueba"
                                    cmd2.CommandType = CommandType.StoredProcedure
                                    cmd2.Connection = conex2
                                    conex2.Open()
                                    Using da2 As New MySqlDataAdapter(cmd2)
                                        'DgvPrueba1.AutoGenerateColumns = False
                                        Using dt2 As New DataTable
                                            da.Fill(dt2)
                                            DgvPrueba2.DataSource = dt2
                                        End Using
                                    End Using
                                End Using
                            End Using
                        End Using
                    End Using
                End Using
            End Using
        End Sub

    Como veras use dos datagridview para verificar que en realidad me trae los datos de las dos bases hasta ahi esta bien.

    Ahora te consulto, como hago para verificar cual es el producto que me falta en la base local y como hago para mostralo en un datagriview, mi estimado amigo J. Carlos Herrero.

    Desde ya te agradezco Muchisimo tu ayuda y espero me puedas solucionar mi pedido. 

      

    viernes, 8 de mayo de 2020 20:51
  • Hola:
    Para el ejemplo he creado 2 DataTables desconectados
    El ejemplo tiene 2 soluciones cada una asociada a un boton

    En un Form como el de la imagen

    Copia y pega el siguiente codigo

    Option Explicit On
    Option Strict On
    Public Class Form3
        Private mdtTableA As New DataTable("TableA")
        Private mdtTableB As New DataTable("TableB")
        Private Sub Form3_Load(sender As Object, e As EventArgs) Handles Me.Load
            Try
                Dim lDataColumn As DataColumn
                lDataColumn = New DataColumn("id", GetType(Integer))
                mdtTableA.Columns.Add(lDataColumn)
                lDataColumn = New DataColumn("column", GetType(String))
                mdtTableA.Columns.Add(lDataColumn)
                'Carga de Datos
                Dim lDataRow As DataRow
                lDataRow = mdtTableA.NewRow
                lDataRow.Item("id") = 1
                lDataRow.Item("column") = "data1"
                mdtTableA.Rows.Add(lDataRow)
                '
                lDataRow = mdtTableA.NewRow
                lDataRow.Item("id") = 2
                lDataRow.Item("column") = "data2"
                mdtTableA.Rows.Add(lDataRow)
                '
                lDataRow = mdtTableA.NewRow
                lDataRow.Item("id") = 3
                lDataRow.Item("column") = "data3"
                mdtTableA.Rows.Add(lDataRow)
                '
                lDataRow = mdtTableA.NewRow
                lDataRow.Item("id") = 4
                lDataRow.Item("column") = "data4"
                mdtTableA.Rows.Add(lDataRow)
                Me.DataGridView1.DataSource = mdtTableA
                '
                lDataColumn = New DataColumn("id", GetType(Integer))
                mdtTableB.Columns.Add(lDataColumn)
                lDataColumn = New DataColumn("column", GetType(String))
                mdtTableB.Columns.Add(lDataColumn)
                'Carga de Datos
                lDataRow = mdtTableB.NewRow
                lDataRow.Item("id") = 1
                lDataRow.Item("column") = "data1"
                mdtTableB.Rows.Add(lDataRow)
                '
                lDataRow = mdtTableB.NewRow
                lDataRow.Item("id") = 3
                lDataRow.Item("column") = "data3"
                mdtTableB.Rows.Add(lDataRow)
                Me.DataGridView2.DataSource = mdtTableB
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
        Private Sub btnDataset_Click(sender As Object, e As EventArgs) Handles btnDataset.Click
            btnDataset.Enabled = False
            btnRecorrer.Enabled = False
            ComparaDataTables()
        End Sub
        Private Sub ComparaDataTables()
            Dim mdtTableC As New DataTable("TableC")
            Try
                'Debe usar un conjunto de datos para usar un objeto DataRelation
                Using DataSet As New DataSet()
                    'Agregar tablas
                    DataSet.Tables.AddRange(New DataTable() {mdtTableA.Copy(), mdtTableB.Copy()})
                    'Obtener columnas para la relación de datos
                    Dim ColumnasPrimera As DataColumn() = New DataColumn(DataSet.Tables(0).Columns.Count - 1) {}
                    For liCiclo As Integer = 0 To ColumnasPrimera.Length - 1
                        ColumnasPrimera(liCiclo) = DataSet.Tables(0).Columns(liCiclo)
                    Next
                    Dim ColumnasSegunda As DataColumn() = New DataColumn(DataSet.Tables(1).Columns.Count - 1) {}
                    For liCiclo As Integer = 0 To ColumnasSegunda.Length - 1
                        ColumnasSegunda(liCiclo) = DataSet.Tables(1).Columns(liCiclo)
                    Next
                    'Create DataRelation
                    Dim Relacion As New DataRelation(String.Empty, ColumnasPrimera, ColumnasSegunda, False)
                    DataSet.Relations.Add(Relacion)
                    'Crear columnas para la tabla de retorno
                    For liCiclo As Integer = 0 To mdtTableA.Columns.Count - 1
                        mdtTableC.Columns.Add(mdtTableA.Columns(liCiclo).ColumnName, mdtTableA.Columns(liCiclo).DataType)
                    Next
                    'Si la primera fila no está en la segunda, Agregar a la tabla de retorno.
                    mdtTableC.BeginLoadData()
                    For Each parentrow As DataRow In DataSet.Tables(0).Rows
                        Dim childrows As DataRow() = parentrow.GetChildRows(Relacion)
                        If childrows Is Nothing OrElse childrows.Length = 0 Then
                            mdtTableC.LoadDataRow(parentrow.ItemArray, True)
                        End If
                    Next
                    mdtTableC.EndLoadData()
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
            DataGridView3.DataSource = mdtTableC
        End Sub
        Private Sub btnRecorrer_Click(sender As Object, e As EventArgs) Handles btnRecorrer.Click
            btnDataset.Enabled = False
            btnRecorrer.Enabled = False
            'Clonar la estructura del datatable diferencia
            Dim mdtTableC As DataTable = mdtTableA.Clone
            Dim FilaC As DataRow
            For Each FilaA As DataRow In mdtTableA.Rows
                If Buscar(Convert.ToInt32(FilaA.Item("Id"))) = False Then
                    FilaC = mdtTableC.NewRow
                    FilaC.Item("id") = FilaA.Item("id")
                    FilaC.Item("column") = FilaA.Item("column")
                    mdtTableC.Rows.Add(FilaC)
                End If
            Next
            DataGridView3.DataSource = mdtTableC
        End Sub
        Private Function Buscar(vId As Integer) As Boolean
            Dim Retorno As Boolean = False
            Try
                Dim Consulta = From Valor In mdtTableB Where Valor.Field(Of Integer)("Id") = vId
                If Consulta.Count() > 0 Then
                    Retorno = True
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
            Return Retorno
        End Function
        Private Sub btnLimpiar_Click(sender As Object, e As EventArgs) Handles btnLimpiar.Click
            btnDataset.Enabled = True
            btnRecorrer.Enabled = True
            DataGridView3.DataSource = Nothing
        End Sub
    End Class

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta dj mac40 viernes, 15 de mayo de 2020 17:18
    sábado, 9 de mayo de 2020 7:47
  • Muy buenos dias amigo J. Carlos Herrero, te pido mil disculpas por no haberte constestado antes pero estuve probando el codigo que me facilitaste y funciona como lo describes, pero cuando trato de adaptarlo a mi proyecto me tira el siguiente error:

    

    cambie esta linea:

    DataSet.Tables.AddRange(New DataTable() {mdtTableA.Copy(), mdtTableB.Copy()})

    por esta y me genera ese error:

    DataSet.Tables.AddRange(New DataTable() {dt.Copy(), dt2.Copy()})

    es seguro que estoy haciendo algo mal mi estimado amigo pero no se que es, si me pudes decir donde debo colocar el (dt, dt2) que son los que genero en la consulta.

    Dese ya muchisimas gracias.

    lunes, 11 de mayo de 2020 16:29
  • Hola:
    El mensaje de error es "bastante claro"
    Te dice que algun datatable (dt o dt2) NO tiene ninguna columna.
    Tendras que revisar como se cargan esos 2 datatables

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta dj mac40 viernes, 15 de mayo de 2020 17:18
    lunes, 11 de mayo de 2020 18:18
  • Muy buenos días amigo J. Carlos Herrero, efectivamente tenias razón, no me daba cuenta pero levantaba el código que me mandaste después de que cerraba los datatable por eso me daba ese error. Ahora si lo pude hacer funcionar mi estimado amigo.

    Muchísimas Gracias amigo J. Carlos Herrero por tu tiempo en solucionar mi problema.

    viernes, 15 de mayo de 2020 17:23