Principales respuestas
CONSULTAR DOS TABLAS EN DIFERENTES BASES DE DATOS MYSQL DESDE VISUAL 2015

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!!!!!......
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- Propuesto como respuesta Oystein EdwardsModerator viernes, 8 de mayo de 2020 15:42
- Marcado como respuesta dj mac40 viernes, 15 de mayo de 2020 17:18
-
Hola:
Para el ejemplo he creado 2 DataTables desconectados
El ejemplo tiene 2 soluciones cada una asociada a un botonEn un Form como el de la imagen
Copia y pega el siguiente codigo
Option Explicit On
Option Strict OnPublic 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 TryEnd SubPrivate Sub btnDataset_Click(sender As Object, e As EventArgs) Handles btnDataset.Click
btnDataset.Enabled = False
btnRecorrer.Enabled = False
ComparaDataTables()
End SubPrivate 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 SubPrivate 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 SubPrivate 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 FunctionPrivate 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
-
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 datatablesUn saludo desde Bilbo
Carlos- Marcado como respuesta dj mac40 viernes, 15 de mayo de 2020 17: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.
-
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- Propuesto como respuesta Oystein EdwardsModerator viernes, 8 de mayo de 2020 15:42
- Marcado como respuesta dj mac40 viernes, 15 de mayo de 2020 17:18
-
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 SubComo 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.
-
Hola:
Para el ejemplo he creado 2 DataTables desconectados
El ejemplo tiene 2 soluciones cada una asociada a un botonEn un Form como el de la imagen
Copia y pega el siguiente codigo
Option Explicit On
Option Strict OnPublic 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 TryEnd SubPrivate Sub btnDataset_Click(sender As Object, e As EventArgs) Handles btnDataset.Click
btnDataset.Enabled = False
btnRecorrer.Enabled = False
ComparaDataTables()
End SubPrivate 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 SubPrivate 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 SubPrivate 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 FunctionPrivate 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
-
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.
-
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 datatablesUn saludo desde Bilbo
Carlos- Marcado como respuesta dj mac40 viernes, 15 de mayo de 2020 17: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.