none
Como llenar un DataGridView con 2 o mas consultas mysql

    Pregunta

  • Hola, tengo un problema que no he podido solventar y por ello escribo a ver si me pueden ayudar por favor, estoy trabajando con vb.net y mysql, el problema es el siguiente:

    tengo 4 servidores diferentes cada uno con sus datos de conexión (host, puerto, usuario, contraseña) y tengo una consulta mysql muy sencilla que es esta: "SELECT codprod,nombre,stock FROM productos", tengo también la cadena de conexión de cada servidor. puedo llenar una DataGridView con esa misma consulta pero que el codprod, el nombre y el primer stock sea del primer servidor y de los otros 3 muestre solo el stock. 

    El DataGridView quedaría algo así:

    codprod |  nombre                          | stockServer1   | stockServer2   | stockServer3   | stockServer4 |  Total

          1           galletas                                  1                          2                      5                        0                   8

          2           chocolate                               0                          4                     10                       2                 16

          3           agua mineral                          2                         2                       5                        6                 15

          4           refresco                                  7                          5                       0                       0                  12

          5             pan dulce                             10                         0                       3                        2                 15

    PD: la estructura y datos de la tabla (productos) es la misma en los 4 servidores. agradezco grandemente su ayuda ya que he buscado otros métodos como por ejemplo "tablas federadas" pero con respecto a ese tema no he podido entenderlo ya que no soy un experto en programación estoy aprendiendo poco a poco y por ello no he logrado solucionar el problema y llevo mucho tiempo en esto.

    gracias de antemano.

    sábado, 13 de abril de 2019 20:58

Respuestas

  • Hola:
    Si no encuentras la solucion con las tablas federadas (a mi me parece la opcion mas correcta y rapida), en este ejemplo se leen datos de 3 tablas identicas que estan en un mismo servidor pero leyendo tabla a tabla.
    En un Form con 1 DGV, copia y pega el siguiente código

    Option Explicit On
    Option Strict On
    Imports MySql.Data.MySqlClient
    Public Class Form1
        Private mdtDataTable As New DataTable
        Private msCadenaMySql1 As String = "Data source=127.0.0.1;userid=root;password='XXXXX';database=basedatos1;charset=utf8;"
        Private msCadenaMySql2 As String = "Data source=127.0.0.1;userid=root;password='XXXXX';database=basedatos2;charset=utf8;"
        Private msCadenaMySql3 As String = "Data source=127.0.0.1;userid=root;password='XXXXX';database=basedatos3;charset=utf8;"
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.DataGridView1.AllowUserToAddRows = False
            Me.DataGridView1.DataSource = mdtDataTable
            Try
                Using lConexion As New MySqlConnection(msCadenaMySql1)
                    Dim lsQuery As String = "SELECT codprod, nombre, stock AS stock1, 0 AS stock2, 0 AS stock3, 0 AS total FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable)
                    End Using
                End Using
                'Lenado de las columnas stock2, stock3 y total
                For Each loFila As DataRow In mdtDataTable.Rows
                    lP_Stock2(loFila)
                    lP_Stock3(loFila)
                    loFila("total") = CInt(loFila.Item("stock1")) + CInt(loFila.Item("stock2")) + CInt(loFila.Item("stock3"))
                Next
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
        Private Sub lP_Stock2(ByVal voFila As DataRow)
            Dim liStock As Integer = 0
            Try
                Using lConexion As New MySqlConnection(msCadenaMySql2)
                    Dim lsQuery As String = "SELECT stock FROM productos WHERE codprod=@Codprod"
                    Using lComando As New MySqlCommand(lsQuery, lConexion)
                        lComando.Parameters.Add(New MySqlParameter("@Codprod", voFila("codprod")))
                        lConexion.Open()
                        liStock = CInt(lComando.ExecuteScalar())
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
            voFila("stock2") = liStock
        End Sub

        Private Sub lP_Stock3(ByVal voFila As DataRow)
            Dim liStock As Integer = 0
            Try
                Using lConexion As New MySqlConnection(msCadenaMySql3)
                    Dim lsQuery As String = "SELECT stock FROM productos WHERE codprod=@Codprod"
                    Using lComando As New MySqlCommand(lsQuery, lConexion)
                        lComando.Parameters.Add(New MySqlParameter("@Codprod", voFila("codprod")))
                        lConexion.Open()
                        liStock = CInt(lComando.ExecuteScalar())
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
            voFila("stock3") = liStock
        End Sub
    End Class

    El resultado es la siguiente imagen

    Un saludo desde Bilbo
    Carlos

    • Propuesto como respuesta Carlos_Ruiz_M lunes, 15 de abril de 2019 14:03
    • Marcado como respuesta BogBer21 martes, 16 de abril de 2019 23:00
    domingo, 14 de abril de 2019 9:07
  • Hola:
    Otra manera de hacer, se cambia el consultar a la BD por la consulta LINQ a datatable con el ahorro de estar conectandose al servidor

    Option Explicit On
    Option Strict On
    Imports MySql.Data.MySqlClient
    Public Class Form1
        Private mdtDataTable As New DataTable
        Private mdtDataTable2 As New DataTable
        Private mdtDataTable3 As New DataTable
      Private msCadenaMySql1 As String = "Data source=127.0.0.1;userid=root;password='XXXXX';database=basedatos1;charset=utf8;"
        Private msCadenaMySql2 As String = "Data source=127.0.0.1;userid=root;password='XXXXX';database=basedatos2;charset=utf8;"
        Private msCadenaMySql3 As String = "Data source=127.0.0.1;userid=root;password='XXXXX';database=basedatos3;charset=utf8;"
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.DataGridView1.AllowUserToAddRows = False
            Me.DataGridView1.DataSource = mdtDataTable
            Try
                Dim lsQuery As String = String.Empty
                Using lConexion As New MySqlConnection(msCadenaMySql1)
                    lsQuery = "SELECT codprod, nombre, stock AS stock1, 0 AS stock2, 0 AS stock3, 0 AS total FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable)
                    End Using
                End Using
                Using lConexion As New MySqlConnection(msCadenaMySql2)
                    lsQuery = "SELECT codprod, stock FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable2)
                    End Using
                End Using
                Using lConexion As New MySqlConnection(msCadenaMySql3)
                    lsQuery = "SELECT codprod, stock FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable3)
                    End Using
                End Using
                'Lenado de las columnas stock2, stock3 y total
                For Each loFila As DataRow In mdtDataTable.Rows
                    loFila("stock2") = lF_iStock2(CInt(loFila.Item("codprod")))
                    loFila("stock3") = lF_iStock3(CInt(loFila.Item("codprod")))
                    loFila("total") = CInt(loFila.Item("stock1")) + CInt(loFila.Item("stock2")) + CInt(loFila.Item("stock3"))
                Next
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
        Private Function lF_iStock2(ByVal vicodprod As Integer) As Integer
            Try
                Dim Consulta = (From Valor In mdtDataTable2 Where Valor.Field(Of Integer)("codprod") = vicodprod Select Valor.Field(Of Integer)("stock")).ToList()
                Return Consulta.Item(0)
            Catch ex As Exception
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return 0
            End Try
        End Function
        Private Function lF_iStock3(ByVal vicodprod As Integer) As Integer
            Try
                Dim Consulta = (From Valor In mdtDataTable3 Where Valor.Field(Of Integer)("codprod") = vicodprod Select Valor.Field(Of Integer)("stock")).ToList()
                Return Consulta.Item(0)
            Catch ex As Exception
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return 0
            End Try
        End Function
    End Class

    Un saludo desde Bilbo
    Carlos


    • Editado J. Carlos Herrero domingo, 14 de abril de 2019 17:22
    • Propuesto como respuesta Carlos_Ruiz_M lunes, 15 de abril de 2019 14:03
    • Marcado como respuesta BogBer21 martes, 16 de abril de 2019 23:00
    domingo, 14 de abril de 2019 17:20
  • Hola:
    Como solo tengo un portatil, la prueba va a ser con 3 tablas (con el mismo nombre y estructura) en 3 BD diferentes (todo en local).
    Voy a cargar 20000 registros en cada tabla.
    Se tarda 8 segundos en grabar los 20000 registros en la primera tabla
    Se tarda 5 segundos en grabar los 20000 registros en la segunda tabla
    Se tarda 7 segundos en grabar los 20000 registros en la tercera tabla

    El codigo del ejemplo es:

    Option Explicit On
    Option Strict On
    Imports MySql.Data.MySqlClient
    Public Class Form4
        Private mdtDataTable As New DataTable
        Private mdtDataTable2 As New DataTable
        Private mdtDataTable3 As New DataTable
        Private msCadenaMySql1 As String = "Data source=127.0.0.1;userid=root;password='XXXXX';database=BD1;charset=utf8;"
        Private msCadenaMySql2 As String = "Data source=127.0.0.1;userid=root;password='XXXXX';database=BD2;charset=utf8;"
        Private msCadenaMySql3 As String = "Data source=127.0.0.1;userid=root;password='XXXXX';database=BD3;charset=utf8;"
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.DataGridView1.AllowUserToAddRows = False
            Me.DataGridView1.DataSource = mdtDataTable
            Me.DataGridView2.AllowUserToAddRows = False
            Me.DataGridView2.DataSource = mdtDataTable2
            Me.DataGridView3.AllowUserToAddRows = False
            Me.DataGridView3.DataSource = mdtDataTable3
            Try
                Dim lsQuery As String = String.Empty
                Using lConexion As New MySqlConnection(msCadenaMySql1)
                    lsQuery = "SELECT codprod, nombre, stock AS stock1, 0.00 AS stock2, 0.00 AS stock3, 0.00 AS total FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable)
                    End Using
                End Using
                '
                Using lConexion As New MySqlConnection(msCadenaMySql2)
                    lsQuery = "SELECT codprod, stock FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable2)
                    End Using
                End Using
                '
                Using lConexion As New MySqlConnection(msCadenaMySql3)
                    lsQuery = "SELECT codprod, stock FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable3)
                    End Using
                End Using
                'Llenado de los TextBox con los numeros de registros
                Me.txtBD1.Text = mdtDataTable.Rows.Count.ToString
                Me.txtBD2.Text = mdtDataTable2.Rows.Count.ToString
                Me.txtBD3.Text = mdtDataTable3.Rows.Count.ToString
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
        Private Sub btnCargar_Click(sender As Object, e As EventArgs) Handles btnCargar.Click
            'Lenado de las columnas stock2, stock3 y total
            Me.TrackBar1.Maximum = mdtDataTable.Rows.Count
            Dim lStopWatch1 As New Stopwatch
            lStopWatch1.Start()
            Dim Duracion1 As TimeSpan
            For Each loFila As DataRow In mdtDataTable.Rows
                Me.TrackBar1.Value += 1
                If Me.TrackBar1.Value Mod 100 = 0 Then
                    Application.DoEvents()
                    Me.txtTrackbar.Text = Me.TrackBar1.Value.ToString
                End If
                loFila("stock2") = lF_dStock2(CInt(loFila.Item("codprod")))
                loFila("stock3") = lF_dStock3(CInt(loFila.Item("codprod")))
                loFila("total") = CInt(loFila.Item("stock1")) + CInt(loFila.Item("stock2")) + CInt(loFila.Item("stock3"))
            Next
            lStopWatch1.Stop()
            Duracion1 = lStopWatch1.Elapsed
            Dim lsDiferencia1 As String = String.Format("{0:00}:{1:00}:{2:00}", Duracion1.Hours, Duracion1.Minutes, Duracion1.Seconds)
            Me.txtTiempoBD1.Text = lsDiferencia1
        End Sub
        Private Function lF_dStock2(ByVal vicodprod As Integer) As Integer
            Try
                Dim Consulta = (From Valor In mdtDataTable2 Where Valor.Field(Of Integer)("codprod") = vicodprod Select Valor.Field(Of Decimal)("stock")).ToList()
                If Consulta.Count() = 0 Then
                    Return 0
                Else
                    Return CInt(Consulta.Item(0))
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return 0
            End Try
        End Function

        Private Function lF_dStock3(ByVal vicodprod As Integer) As Integer
            Try
                Dim Consulta = (From Valor In mdtDataTable3 Where Valor.Field(Of Integer)("codprod") = vicodprod Select Valor.Field(Of Decimal)("stock")).ToList()
                If Consulta.Count() = 0 Then
                    Return 0
                Else
                    Return CInt(Consulta.Item(0))
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return 0
            End Try
        End Function
    End Class

    Imagen Inicial antes de la carga

    Imagen Final antes de la carga


    P.D. (Respuestas a tus interrogantes)

    Si filtras por nombre de producto, el numero de registros es mucho menor -> proceso mas rápido

    Cuando busca en los 17000 registros NO los busca en el sevidor, los busca en los datatables mediante LinQ

    Si solo carga 1 servidor es porque la conexión NO llega a los otros 2 servidores. Esto es tema de comunicaciones y NO hay nada que hacer salvo rezar.

    Se cargaran los servidores que tengan una conexión activa

    En definitiva con este código se cargan 20000 registros en 2 minutos y 19 segundos en la prueba efectuada.

    Espero que te sirva de algo todo esto porque el hilo se ha hecho "inmenso"

    Un saludo desde Bilbo
    Carlos


    • Marcado como respuesta BogBer21 martes, 30 de abril de 2019 19:19
    lunes, 29 de abril de 2019 21:23

Todas las respuestas

  • Hola:
    Si no encuentras la solucion con las tablas federadas (a mi me parece la opcion mas correcta y rapida), en este ejemplo se leen datos de 3 tablas identicas que estan en un mismo servidor pero leyendo tabla a tabla.
    En un Form con 1 DGV, copia y pega el siguiente código

    Option Explicit On
    Option Strict On
    Imports MySql.Data.MySqlClient
    Public Class Form1
        Private mdtDataTable As New DataTable
        Private msCadenaMySql1 As String = "Data source=127.0.0.1;userid=root;password='XXXXX';database=basedatos1;charset=utf8;"
        Private msCadenaMySql2 As String = "Data source=127.0.0.1;userid=root;password='XXXXX';database=basedatos2;charset=utf8;"
        Private msCadenaMySql3 As String = "Data source=127.0.0.1;userid=root;password='XXXXX';database=basedatos3;charset=utf8;"
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.DataGridView1.AllowUserToAddRows = False
            Me.DataGridView1.DataSource = mdtDataTable
            Try
                Using lConexion As New MySqlConnection(msCadenaMySql1)
                    Dim lsQuery As String = "SELECT codprod, nombre, stock AS stock1, 0 AS stock2, 0 AS stock3, 0 AS total FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable)
                    End Using
                End Using
                'Lenado de las columnas stock2, stock3 y total
                For Each loFila As DataRow In mdtDataTable.Rows
                    lP_Stock2(loFila)
                    lP_Stock3(loFila)
                    loFila("total") = CInt(loFila.Item("stock1")) + CInt(loFila.Item("stock2")) + CInt(loFila.Item("stock3"))
                Next
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
        Private Sub lP_Stock2(ByVal voFila As DataRow)
            Dim liStock As Integer = 0
            Try
                Using lConexion As New MySqlConnection(msCadenaMySql2)
                    Dim lsQuery As String = "SELECT stock FROM productos WHERE codprod=@Codprod"
                    Using lComando As New MySqlCommand(lsQuery, lConexion)
                        lComando.Parameters.Add(New MySqlParameter("@Codprod", voFila("codprod")))
                        lConexion.Open()
                        liStock = CInt(lComando.ExecuteScalar())
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
            voFila("stock2") = liStock
        End Sub

        Private Sub lP_Stock3(ByVal voFila As DataRow)
            Dim liStock As Integer = 0
            Try
                Using lConexion As New MySqlConnection(msCadenaMySql3)
                    Dim lsQuery As String = "SELECT stock FROM productos WHERE codprod=@Codprod"
                    Using lComando As New MySqlCommand(lsQuery, lConexion)
                        lComando.Parameters.Add(New MySqlParameter("@Codprod", voFila("codprod")))
                        lConexion.Open()
                        liStock = CInt(lComando.ExecuteScalar())
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
            voFila("stock3") = liStock
        End Sub
    End Class

    El resultado es la siguiente imagen

    Un saludo desde Bilbo
    Carlos

    • Propuesto como respuesta Carlos_Ruiz_M lunes, 15 de abril de 2019 14:03
    • Marcado como respuesta BogBer21 martes, 16 de abril de 2019 23:00
    domingo, 14 de abril de 2019 9:07
  • Hola:
    Otra manera de hacer, se cambia el consultar a la BD por la consulta LINQ a datatable con el ahorro de estar conectandose al servidor

    Option Explicit On
    Option Strict On
    Imports MySql.Data.MySqlClient
    Public Class Form1
        Private mdtDataTable As New DataTable
        Private mdtDataTable2 As New DataTable
        Private mdtDataTable3 As New DataTable
      Private msCadenaMySql1 As String = "Data source=127.0.0.1;userid=root;password='XXXXX';database=basedatos1;charset=utf8;"
        Private msCadenaMySql2 As String = "Data source=127.0.0.1;userid=root;password='XXXXX';database=basedatos2;charset=utf8;"
        Private msCadenaMySql3 As String = "Data source=127.0.0.1;userid=root;password='XXXXX';database=basedatos3;charset=utf8;"
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.DataGridView1.AllowUserToAddRows = False
            Me.DataGridView1.DataSource = mdtDataTable
            Try
                Dim lsQuery As String = String.Empty
                Using lConexion As New MySqlConnection(msCadenaMySql1)
                    lsQuery = "SELECT codprod, nombre, stock AS stock1, 0 AS stock2, 0 AS stock3, 0 AS total FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable)
                    End Using
                End Using
                Using lConexion As New MySqlConnection(msCadenaMySql2)
                    lsQuery = "SELECT codprod, stock FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable2)
                    End Using
                End Using
                Using lConexion As New MySqlConnection(msCadenaMySql3)
                    lsQuery = "SELECT codprod, stock FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable3)
                    End Using
                End Using
                'Lenado de las columnas stock2, stock3 y total
                For Each loFila As DataRow In mdtDataTable.Rows
                    loFila("stock2") = lF_iStock2(CInt(loFila.Item("codprod")))
                    loFila("stock3") = lF_iStock3(CInt(loFila.Item("codprod")))
                    loFila("total") = CInt(loFila.Item("stock1")) + CInt(loFila.Item("stock2")) + CInt(loFila.Item("stock3"))
                Next
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
        Private Function lF_iStock2(ByVal vicodprod As Integer) As Integer
            Try
                Dim Consulta = (From Valor In mdtDataTable2 Where Valor.Field(Of Integer)("codprod") = vicodprod Select Valor.Field(Of Integer)("stock")).ToList()
                Return Consulta.Item(0)
            Catch ex As Exception
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return 0
            End Try
        End Function
        Private Function lF_iStock3(ByVal vicodprod As Integer) As Integer
            Try
                Dim Consulta = (From Valor In mdtDataTable3 Where Valor.Field(Of Integer)("codprod") = vicodprod Select Valor.Field(Of Integer)("stock")).ToList()
                Return Consulta.Item(0)
            Catch ex As Exception
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return 0
            End Try
        End Function
    End Class

    Un saludo desde Bilbo
    Carlos


    • Editado J. Carlos Herrero domingo, 14 de abril de 2019 17:22
    • Propuesto como respuesta Carlos_Ruiz_M lunes, 15 de abril de 2019 14:03
    • Marcado como respuesta BogBer21 martes, 16 de abril de 2019 23:00
    domingo, 14 de abril de 2019 17:20
  • Hola:
    Otra manera de hacer, se cambia el consultar a la BD por la consulta LINQ a datatable con el ahorro de estar conectandose al servidor

    Option Explicit On
    Option Strict On
    Imports MySql.Data.MySqlClient
    Public Class Form1
        Private mdtDataTable As New DataTable
        Private mdtDataTable2 As New DataTable
        Private mdtDataTable3 As New DataTable
      Private msCadenaMySql1 As String = "Data source=127.0.0.1;userid=root;password='XXXXX';database=basedatos1;charset=utf8;"
        Private msCadenaMySql2 As String = "Data source=127.0.0.1;userid=root;password='XXXXX';database=basedatos2;charset=utf8;"
        Private msCadenaMySql3 As String = "Data source=127.0.0.1;userid=root;password='XXXXX';database=basedatos3;charset=utf8;"
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.DataGridView1.AllowUserToAddRows = False
            Me.DataGridView1.DataSource = mdtDataTable
            Try
                Dim lsQuery As String = String.Empty
                Using lConexion As New MySqlConnection(msCadenaMySql1)
                    lsQuery = "SELECT codprod, nombre, stock AS stock1, 0 AS stock2, 0 AS stock3, 0 AS total FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable)
                    End Using
                End Using
                Using lConexion As New MySqlConnection(msCadenaMySql2)
                    lsQuery = "SELECT codprod, stock FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable2)
                    End Using
                End Using
                Using lConexion As New MySqlConnection(msCadenaMySql3)
                    lsQuery = "SELECT codprod, stock FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable3)
                    End Using
                End Using
                'Lenado de las columnas stock2, stock3 y total
                For Each loFila As DataRow In mdtDataTable.Rows
                    loFila("stock2") = lF_iStock2(CInt(loFila.Item("codprod")))
                    loFila("stock3") = lF_iStock3(CInt(loFila.Item("codprod")))
                    loFila("total") = CInt(loFila.Item("stock1")) + CInt(loFila.Item("stock2")) + CInt(loFila.Item("stock3"))
                Next
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
        Private Function lF_iStock2(ByVal vicodprod As Integer) As Integer
            Try
                Dim Consulta = (From Valor In mdtDataTable2 Where Valor.Field(Of Integer)("codprod") = vicodprod Select Valor.Field(Of Integer)("stock")).ToList()
                Return Consulta.Item(0)
            Catch ex As Exception
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return 0
            End Try
        End Function
        Private Function lF_iStock3(ByVal vicodprod As Integer) As Integer
            Try
                Dim Consulta = (From Valor In mdtDataTable3 Where Valor.Field(Of Integer)("codprod") = vicodprod Select Valor.Field(Of Integer)("stock")).ToList()
                Return Consulta.Item(0)
            Catch ex As Exception
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return 0
            End Try
        End Function
    End Class

    Un saludo desde Bilbo
    Carlos


    Hola nuevamente, estuve revisando los dos códigos que me enviaste y esta muy bueno avanzadisimo para mi pero muy bueno gracias.

    pero tuve problemas con ambos codigo con el primero me arrojaba este error:

    El Asistente para la depuración administrada 'ContextSwitchDeadlock' ha detectado un problema en 'D:\BOGBER21 CORP\Visual Studios 2013\SIACE CONSULTAS\SIACE CONSULTAS\bin\Debug\SIACE CONSULTAS.vshost.exe'.

    Información adicional: El CLR no ha podido realizar la transición del contexto COM 0x472fd0 al contexto COM 0x473140 durante 60 segundos. Es probable que el subproceso que contiene el contexto o apartamento de destino esté en espera sin proporcionar mensajes o que procese una operación de ejecución muy larga que no proporcione mensajes Windows. Normalmente, esta situación tiene un impacto negativo en el rendimiento y puede hacer que la aplicación no responda o que acumule continuamente el uso de la memoria. Para evitar este problema, todos los subprocesos de contenedores uniproceso (STA) deberían utilizar primitivos de espera que proporcionen mensajes (como CoWaitForMultipleHandles) y proporcionar mensajes regularmente durante operaciones de ejecución largas.

    y el segundo:

    La conversión especifica no es válida.

    que pudiese ser eso amigo? tengo como dos días intentando corregir esos errores pero siéndote sincero es algo difícil entender un código fuente avanzado para mi.

    martes, 16 de abril de 2019 23:08
  • Hola:
    Me parece mejor el 2º metodo, prueba a ejecutar el siguiente codigo y me dices que resultado visualizas.

    Option Explicit On
    Option Strict On
    Imports MySql.Data.MySqlClient
    Public Class Form1
        Private mdtDataTable As New DataTable
        Private mdtDataTable2 As New DataTable
        Private mdtDataTable3 As New DataTable
        Private msCadenaMySql1 As String = "Data source=192.168.1.1;UserId=user;database=base1;Password=1111;port=3306;charset=utf8;"
        Private msCadenaMySql2 As String = "Data source=192.168.1.2;UserId=user;database=base2;Password=2222;port=3306;charset=utf8;"
        Private msCadenaMySql3 As String = "Data source=192.168.1.3;UserId=user;database=base3;Password=3333;port=3306;charset=utf8;"
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.DataGridView1.AllowUserToAddRows = False
            Me.DataGridView1.DataSource = mdtDataTable
            Try
                Dim lsQuery As String = String.Empty
                Using lConexion As New MySqlConnection(msCadenaMySql1)
                    lsQuery = "SELECT codprod, nombre, stock AS stock1, 0 AS stock2, 0 AS stock3, 0 AS total FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable)
                    End Using
                End Using
                Using lConexion As New MySqlConnection(msCadenaMySql2)
                    lsQuery = "SELECT codprod, stock FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable2)
                    End Using
                End Using
                Using lConexion As New MySqlConnection(msCadenaMySql3)
                    lsQuery = "SELECT codprod, stock FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable3)
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
            MessageBox.Show("Nº Registros mdtDataTable: " & mdtDataTable.Rows.Count.ToString & vbCrLf & "Nº Registros mdtDataTable2: " & mdtDataTable2.Rows.Count.ToString & vbCrLf & "Nº Registros mdtDataTable3: " & mdtDataTable3.Rows.Count.ToString)
        End Sub
    End Class

    > La conversión especifica no es válida .<
    En que linea te da ese mensaje de error porque no soy capaz de reproducirlo pues mi ejemplo funciona correctamente

    Un saludo desde Bilbo
    Carlos


    miércoles, 17 de abril de 2019 10:07
  • Hola:
    Me parece mejor el 2º metodo, prueba a ejecutar el siguiente codigo y me dices que resultado visualizas.

    Option Explicit On
    Option Strict On
    Imports MySql.Data.MySqlClient
    Public Class Form1
        Private mdtDataTable As New DataTable
        Private mdtDataTable2 As New DataTable
        Private mdtDataTable3 As New DataTable
        Private msCadenaMySql1 As String = "Data source=192.168.1.1;UserId=user;database=base1;Password=1111;port=3306;charset=utf8;"
        Private msCadenaMySql2 As String = "Data source=192.168.1.2;UserId=user;database=base2;Password=2222;port=3306;charset=utf8;"
        Private msCadenaMySql3 As String = "Data source=192.168.1.3;UserId=user;database=base3;Password=3333;port=3306;charset=utf8;"
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.DataGridView1.AllowUserToAddRows = False
            Me.DataGridView1.DataSource = mdtDataTable
            Try
                Dim lsQuery As String = String.Empty
                Using lConexion As New MySqlConnection(msCadenaMySql1)
                    lsQuery = "SELECT codprod, nombre, stock AS stock1, 0 AS stock2, 0 AS stock3, 0 AS total FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable)
                    End Using
                End Using
                Using lConexion As New MySqlConnection(msCadenaMySql2)
                    lsQuery = "SELECT codprod, stock FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable2)
                    End Using
                End Using
                Using lConexion As New MySqlConnection(msCadenaMySql3)
                    lsQuery = "SELECT codprod, stock FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable3)
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
            MessageBox.Show("Nº Registros mdtDataTable: " & mdtDataTable.Rows.Count.ToString & vbCrLf & "Nº Registros mdtDataTable2: " & mdtDataTable2.Rows.Count.ToString & vbCrLf & "Nº Registros mdtDataTable3: " & mdtDataTable3.Rows.Count.ToString)
        End Sub
    End Class

    > La conversión especifica no es válida .<
    En que linea te da ese mensaje de error porque no soy capaz de reproducirlo pues mi ejemplo funciona correctamente

    Un saludo desde Bilbo
    Carlos


    Hola, esta linea de codigo me da el error > La conversión especifica no es válida .<

    Private Function lF_iStock2(ByVal vicodprod As Integer) As Integer
            Try
                Dim Consulta = (From Valor In mdtDataTable2 Where Valor.Field(Of Integer)("codprod") = vicodprod Select Valor.Field(Of Integer)("stock")).ToList()
                Return Consulta.Item(0)
            Catch ex As Exception
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return 0
            End Try
        End Function

    miércoles, 17 de abril de 2019 19:28
  • Hola:
    Me parece mejor el 2º metodo, prueba a ejecutar el siguiente codigo y me dices que resultado visualizas.

    Option Explicit On
    Option Strict On
    Imports MySql.Data.MySqlClient
    Public Class Form1
        Private mdtDataTable As New DataTable
        Private mdtDataTable2 As New DataTable
        Private mdtDataTable3 As New DataTable
        Private msCadenaMySql1 As String = "Data source=192.168.1.1;UserId=user;database=base1;Password=1111;port=3306;charset=utf8;"
        Private msCadenaMySql2 As String = "Data source=192.168.1.2;UserId=user;database=base2;Password=2222;port=3306;charset=utf8;"
        Private msCadenaMySql3 As String = "Data source=192.168.1.3;UserId=user;database=base3;Password=3333;port=3306;charset=utf8;"
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.DataGridView1.AllowUserToAddRows = False
            Me.DataGridView1.DataSource = mdtDataTable
            Try
                Dim lsQuery As String = String.Empty
                Using lConexion As New MySqlConnection(msCadenaMySql1)
                    lsQuery = "SELECT codprod, nombre, stock AS stock1, 0 AS stock2, 0 AS stock3, 0 AS total FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable)
                    End Using
                End Using
                Using lConexion As New MySqlConnection(msCadenaMySql2)
                    lsQuery = "SELECT codprod, stock FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable2)
                    End Using
                End Using
                Using lConexion As New MySqlConnection(msCadenaMySql3)
                    lsQuery = "SELECT codprod, stock FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable3)
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
            MessageBox.Show("Nº Registros mdtDataTable: " & mdtDataTable.Rows.Count.ToString & vbCrLf & "Nº Registros mdtDataTable2: " & mdtDataTable2.Rows.Count.ToString & vbCrLf & "Nº Registros mdtDataTable3: " & mdtDataTable3.Rows.Count.ToString)
        End Sub
    End Class

    > La conversión especifica no es válida .<
    En que linea te da ese mensaje de error porque no soy capaz de reproducirlo pues mi ejemplo funciona correctamente

    Un saludo desde Bilbo
    Carlos

    Hoal ya probe el ultimo codigo que me mandaste y compilo bien pero con un detalle que no me cargo el stock de la columna stock2 ni stock3 solo el del stock1

    miércoles, 17 de abril de 2019 19:37
  • Me Salen esos dos errores.

    ese error creo que es por una de las conexiones.

    y este es el error que me arroja del que te comente.

    disculpa por tanta molestia pero de verdad necesito de ese programa y por supuesto de ayuda. 

    gracias de antemano por su ayuda.

    miércoles, 17 de abril de 2019 20:21
  • Hola:
    Vamos a ver si nos aclaramos porque esto se esta enredando
    En el ultimo codigo que te mande lo que hace es:
    Leer la tabla productos del servidor 192.168.1.1 y la base de datos base1 y cargar lo leido en un datatable (mdtDataTable)
    Leer la tabla productos del servidor 192.168.1.2 y la base de datos base2 y cargar lo leido en un datatable (mdtDataTable2)
    Leer la tabla productos del servidor 192.168.1.3 y la base de datos base3 y cargar lo leido en un datatable (mdtDataTable3)
    Visualizar una ventana diciendo cuantos registros tienen esos 3 datatables, que tienen que ser iguales a los registros que tienen sus respectivas tablas.
    Ese dato NO me lo has mostrado.

    Luego te pido que me muestres la linea donde te error de > La conversión especifica no es válida .<
    y me indicas NO 1 línea, sino la funcion entera.
    Con esto lo que se me ocurre es que el campo codpro no sea integer.
    ¿Puedes mostrar las estructuras de las 3 tablas?
    A ver si con es ayuda por tu parte, conseguimos arreglar este "entuerto"

    Un saludo dsde Bilbo
    Carlos

    miércoles, 17 de abril de 2019 20:43
  • Hola.

    cierto tienes razón del todo no me he explicado bien. pero por supuesto que si te paso la estructura de la tabla es la misma es los 3 servidores.

    aquí la imagen:

    aquí el resultado de la consulta de los registros que tienen las database

    miércoles, 17 de abril de 2019 22:38
  • Hola:
    El error que estaba dando es porque yo habia supuesto que el campo stock era integer en vez de decimal.
    Tus valores son siempre enteros, no hay ningun valor como 11,23 porque lo defines con 0 decimales

    Copia y pega el siguiente código

    Option Explicit On
    Option Strict On
    Imports MySql.Data.MySqlClient
    Public Class Form1
        Private mdtDataTable As New DataTable
        Private mdtDataTable2 As New DataTable
        Private mdtDataTable3 As New DataTable

     Private mdtDataTable3 As New DataTable
        Private msCadenaMySql1 As String = "Data source=192.168.1.1;UserId=user;database=base1;Password=1111;port=3306;charset=utf8;"
        Private msCadenaMySql2 As String = "Data source=192.168.1.2;UserId=user;database=base2;Password=2222;port=3306;charset=utf8;"
        Private msCadenaMySql3 As String = "Data source=192.168.1.3;UserId=user;database=base3;Password=3333;port=3306;charset=utf8;"
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.DataGridView1.AllowUserToAddRows = False
            Me.DataGridView1.DataSource = mdtDataTable
            Try
                Dim lsQuery As String = String.Empty
                Using lConexion As New MySqlConnection(msCadenaMySql1)
                    lsQuery = "SELECT codprod, nombre, stock AS stock1, 0 AS stock2, 0 AS stock3, 0 AS total FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable)
                    End Using
                End Using
                Using lConexion As New MySqlConnection(msCadenaMySql2)
                    lsQuery = "SELECT codprod, stock FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable2)
                    End Using
                End Using
                Using lConexion As New MySqlConnection(msCadenaMySql3)
                    lsQuery = "SELECT codprod, stock FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable3)
                    End Using
                End Using
                'Lenado de las columnas stock2, stock3 y total
                For Each loFila As DataRow In mdtDataTable.Rows
                    loFila("stock2") = lF_dStock2(CInt(loFila.Item("codprod")))
                    loFila("stock3") = lF_dStock3(CInt(loFila.Item("codprod")))
                     loFila("total") = CDec(loFila.Item("stock1")) + CDec(loFila.Item("stock2")) + CDec(loFila.Item("stock3"))
                Next
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
        Private Function lF_dStock2(ByVal vicodprod As Integer) As Decimal
            Try
                Dim Consulta = (From Valor In mdtDataTable2 Where Valor.Field(Of Integer)("codprod") = vicodprod Select Valor.Field(Of Decimal)("stock")).ToList()
                If Consulta.Count() = 0 Then
                    Return 0
                Else
                    Return Consulta.Item(0)
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return 0
            End Try
        End Function

        Private Function lF_dStock3(ByVal vicodprod As Integer) As Decimal
            Try
                Dim Consulta = (From Valor In mdtDataTable3 Where Valor.Field(Of Integer)("codprod") = vicodprod Select Valor.Field(Of Decimal)("stock")).ToList()
                If Consulta.Count() = 0 Then
                    Return 0
                Else
                    Return Consulta.Item(0)
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return 0
            End Try
        End Function
    End Class

    P.D.
    Espero que ahora te funcione sin errores, sino ya me contaras

    Un saludo desde Bilbo
    Carlos



    jueves, 18 de abril de 2019 7:37
  • Hola:
    He cambiado las estructuras de las 3 tabla y en vez de que el campo stock sea decimal(10,0) sea decimal(10,2)
    Copia y pega el siguiente código

    Option Explicit On
    Option Strict On
    Imports MySql.Data.MySqlClient

    Public Class Form1
        Private mdtDataTable As New DataTable
        Private mdtDataTable2 As New DataTable
        Private mdtDataTable3 As New DataTable

     Private mdtDataTable3 As New DataTable
        Private msCadenaMySql1 As String = "Data source=192.168.1.1;UserId=user;database=base1;Password=1111;port=3306;charset=utf8;"
        Private msCadenaMySql2 As String = "Data source=192.168.1.2;UserId=user;database=base2;Password=2222;port=3306;charset=utf8;"
        Private msCadenaMySql3 As String = "Data source=192.168.1.3;UserId=user;database=base3;Password=3333;port=3306;charset=utf8;"
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.DataGridView1.AllowUserToAddRows = False
            Me.DataGridView1.DataSource = mdtDataTable
            Try
                Dim lsQuery As String = String.Empty
                Using lConexion As New MySqlConnection(msCadenaMySql1)
                    lsQuery = "SELECT codprod, nombre, stock AS stock1, 0.00 AS stock2, 0.00 AS stock3, 0.00 AS total FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable)
                    End Using
                End Using
                Using lConexion As New MySqlConnection(msCadenaMySql2)
                    lsQuery = "SELECT codprod, stock FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable2)
                    End Using
                End Using
                Using lConexion As New MySqlConnection(msCadenaMySql3)
                    lsQuery = "SELECT codprod, stock FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable3)
                    End Using
                End Using
                'Lenado de las columnas stock2, stock3 y total
                For Each loFila As DataRow In mdtDataTable.Rows
                    loFila("stock2") = lF_dStock2(CInt(loFila.Item("codprod")))
                    loFila("stock3") = lF_dStock3(CInt(loFila.Item("codprod")))
                     loFila("total") = CDec(loFila.Item("stock1")) + CDec(loFila.Item("stock2")) + CDec(loFila.Item("stock3"))
              Next
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
        Private Function lF_dStock2(ByVal vicodprod As Integer) As Decimal
            Try
                Dim Consulta = (From Valor In mdtDataTable2 Where Valor.Field(Of Integer)("codprod") = vicodprod Select Valor.Field(Of Decimal)("stock")).ToList()
                If Consulta.Count() = 0 Then
                    Return 0
                Else
                    Return Consulta.Item(0)
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return 0
            End Try
        End Function

        Private Function lF_dStock3(ByVal vicodprod As Integer) As Decimal
            Try
                Dim Consulta = (From Valor In mdtDataTable3 Where Valor.Field(Of Integer)("codprod") = vicodprod Select Valor.Field(Of Decimal)("stock")).ToList()
                If Consulta.Count() = 0 Then
                    Return 0
                Else
                    Return Consulta.Item(0)
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return 0
            End Try
        End Function
    End Class

    P.D.
    El resultado es

    Un saludo desde Bilbo
    Carlos


    jueves, 18 de abril de 2019 8:11
  • Hola.

    he probado el código que me mandaste y lamentablemente no funciono trate de modificarlo pero como le había dicho no son tan experto en visual y me es un poco difícil entender el código fuente. No se que hacer es uno de los problemas muy difíciles de resolver.

    estos son los errores que me muestra:

    y otro no se si llamarlo error es que no se llenan las columnas solo una de la consulta principal pero las otras no

    esta:

    miércoles, 24 de abril de 2019 19:10
  • Hola:
    ¿Puedes poner el codigo para poder revisarlo a ver si damos donde esta el error?

    > pero como le había dicho no son tan experto en visual y me es un poco difícil entender el código fuente. <.
    ¿Si copia y pagas el ejemplo que te he puesto yo, que te aparece?

    Un saludo desde Bilbo
    Carlos


    miércoles, 24 de abril de 2019 19:19
  • Hola.

    estos son los captures:

    jueves, 25 de abril de 2019 15:44
  • Hola:
    Tienes error segun se puede ver en la siguiente imagen

    Para que no te de error prueba a deshabilitar el ContextSwitchDeadLock.(Da probleas cuando hay muchos calculos matematicos)
    Para ello sigue las siguientes imagenes.

    De todas las formas te mando un ejemplo en el que se vean los 3 datatables

    Option Explicit On
    Option Strict On
    Imports MySql.Data.MySqlClient
    Public Class Form4
        Private mdtDataTable As New DataTable
        Private mdtDataTable2 As New DataTable
        Private mdtDataTable3 As New DataTable
        Private msCadenaMySql1 As String = "Data source=127.0.0.1;userid=root;password='XXXXX';database=base1;charset=utf8;"
        Private msCadenaMySql2 As String = "Data source=127.0.0.1;userid=root;password='XXXXX';database=base2;charset=utf8;"
        Private msCadenaMySql3 As String = "Data source=127.0.0.1;userid=root;password='XXXXX';database=base3;charset=utf8;"
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.DataGridView1.AllowUserToAddRows = False
            Me.DataGridView1.DataSource = mdtDataTable
            Me.DataGridView2.AllowUserToAddRows = False
            Me.DataGridView2.DataSource = mdtDataTable2
            Me.DataGridView3.AllowUserToAddRows = False
            Me.DataGridView3.DataSource = mdtDataTable
            Try
                Dim lsQuery As String = String.Empty
                Using lConexion As New MySqlConnection(msCadenaMySql1)
                    lsQuery = "SELECT codprod, nombre, stock AS stock1, 0.00 AS stock2, 0.00 AS stock3, 0.00 AS total FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable)
                    End Using
                End Using
                Using lConexion As New MySqlConnection(msCadenaMySql2)
                    lsQuery = "SELECT codprod, stock FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable2)
                    End Using
                End Using
                Using lConexion As New MySqlConnection(msCadenaMySql3)
                    lsQuery = "SELECT codprod, stock FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable3)
                    End Using
                End Using
                'Lenado de los TextBox con los numeros de registros
                Me.txtServidor1.Text = mdtDataTable.Rows.Count.ToString
                Me.txtServidor2.Text = mdtDataTable2.Rows.Count.ToString
                Me.txtServidor3.Text = mdtDataTable3.Rows.Count.ToString
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
    End Class
    El resultado es la siguiente imagen

    P.D.
    Ya me contaras como va el proceso, ya que NO es problema de codigo, sino de configuracion de Visual Studio

    Un saludo desde Bilbo
    Carlos


    jueves, 25 de abril de 2019 17:43
  • Hola, disculpa lo tarde en responder pasa que factor pais (Venezuela) se pone un poco dificil.

    probe el ejemplo que me enviaste y fino me genero resultados en los 3 DGV's pero cuando unico con la otro consulta para que me muestre los resultados en uno solo y tarda demasiado y no hace nada, tambien ya le desactive la excepcion ContextSwitchDeadLock

    aqui el ejemplo:

    lunes, 29 de abril de 2019 15:52
  • Hola:
    Segun la imagen que muestras, hasta el codprod 72 tienen un stock igual a 0 en las 3 tablas, con lo cual la imagen en la que muestras las 3 columnas de stock y estan todas a 0 es correcta.
    ¿Te da algun error para que NO finalize el proceso.?

    Un saludo desde Bilbo
    Catlos

    lunes, 29 de abril de 2019 17:08
  • Con ese código de cargar cada servidor con su propio DataGridView funciona excelente, pero cuando genero todo en un solo DataGridView tarda muchísimo y otro caso es cuando se pierde la conexión con un servidor sea por Internet o cortes de electricidad carga los datos del servidor 1 y los otros 2 no cargan que sera eso?

    aquí la imagen:

    aquí tome captures de cuando genere la consulta para que carguen todos los servidores en un solo DataGridView:

    y esta cuando termino la carga y genero los resultados:


    lunes, 29 de abril de 2019 17:51
  • Aqui esta esta imagen de ejemplo:

    lunes, 29 de abril de 2019 19:46
  • Hola:
    Como solo tengo un portatil, la prueba va a ser con 3 tablas (con el mismo nombre y estructura) en 3 BD diferentes (todo en local).
    Voy a cargar 20000 registros en cada tabla.
    Se tarda 8 segundos en grabar los 20000 registros en la primera tabla
    Se tarda 5 segundos en grabar los 20000 registros en la segunda tabla
    Se tarda 7 segundos en grabar los 20000 registros en la tercera tabla

    El codigo del ejemplo es:

    Option Explicit On
    Option Strict On
    Imports MySql.Data.MySqlClient
    Public Class Form4
        Private mdtDataTable As New DataTable
        Private mdtDataTable2 As New DataTable
        Private mdtDataTable3 As New DataTable
        Private msCadenaMySql1 As String = "Data source=127.0.0.1;userid=root;password='XXXXX';database=BD1;charset=utf8;"
        Private msCadenaMySql2 As String = "Data source=127.0.0.1;userid=root;password='XXXXX';database=BD2;charset=utf8;"
        Private msCadenaMySql3 As String = "Data source=127.0.0.1;userid=root;password='XXXXX';database=BD3;charset=utf8;"
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.DataGridView1.AllowUserToAddRows = False
            Me.DataGridView1.DataSource = mdtDataTable
            Me.DataGridView2.AllowUserToAddRows = False
            Me.DataGridView2.DataSource = mdtDataTable2
            Me.DataGridView3.AllowUserToAddRows = False
            Me.DataGridView3.DataSource = mdtDataTable3
            Try
                Dim lsQuery As String = String.Empty
                Using lConexion As New MySqlConnection(msCadenaMySql1)
                    lsQuery = "SELECT codprod, nombre, stock AS stock1, 0.00 AS stock2, 0.00 AS stock3, 0.00 AS total FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable)
                    End Using
                End Using
                '
                Using lConexion As New MySqlConnection(msCadenaMySql2)
                    lsQuery = "SELECT codprod, stock FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable2)
                    End Using
                End Using
                '
                Using lConexion As New MySqlConnection(msCadenaMySql3)
                    lsQuery = "SELECT codprod, stock FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTable3)
                    End Using
                End Using
                'Llenado de los TextBox con los numeros de registros
                Me.txtBD1.Text = mdtDataTable.Rows.Count.ToString
                Me.txtBD2.Text = mdtDataTable2.Rows.Count.ToString
                Me.txtBD3.Text = mdtDataTable3.Rows.Count.ToString
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
        Private Sub btnCargar_Click(sender As Object, e As EventArgs) Handles btnCargar.Click
            'Lenado de las columnas stock2, stock3 y total
            Me.TrackBar1.Maximum = mdtDataTable.Rows.Count
            Dim lStopWatch1 As New Stopwatch
            lStopWatch1.Start()
            Dim Duracion1 As TimeSpan
            For Each loFila As DataRow In mdtDataTable.Rows
                Me.TrackBar1.Value += 1
                If Me.TrackBar1.Value Mod 100 = 0 Then
                    Application.DoEvents()
                    Me.txtTrackbar.Text = Me.TrackBar1.Value.ToString
                End If
                loFila("stock2") = lF_dStock2(CInt(loFila.Item("codprod")))
                loFila("stock3") = lF_dStock3(CInt(loFila.Item("codprod")))
                loFila("total") = CInt(loFila.Item("stock1")) + CInt(loFila.Item("stock2")) + CInt(loFila.Item("stock3"))
            Next
            lStopWatch1.Stop()
            Duracion1 = lStopWatch1.Elapsed
            Dim lsDiferencia1 As String = String.Format("{0:00}:{1:00}:{2:00}", Duracion1.Hours, Duracion1.Minutes, Duracion1.Seconds)
            Me.txtTiempoBD1.Text = lsDiferencia1
        End Sub
        Private Function lF_dStock2(ByVal vicodprod As Integer) As Integer
            Try
                Dim Consulta = (From Valor In mdtDataTable2 Where Valor.Field(Of Integer)("codprod") = vicodprod Select Valor.Field(Of Decimal)("stock")).ToList()
                If Consulta.Count() = 0 Then
                    Return 0
                Else
                    Return CInt(Consulta.Item(0))
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return 0
            End Try
        End Function

        Private Function lF_dStock3(ByVal vicodprod As Integer) As Integer
            Try
                Dim Consulta = (From Valor In mdtDataTable3 Where Valor.Field(Of Integer)("codprod") = vicodprod Select Valor.Field(Of Decimal)("stock")).ToList()
                If Consulta.Count() = 0 Then
                    Return 0
                Else
                    Return CInt(Consulta.Item(0))
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return 0
            End Try
        End Function
    End Class

    Imagen Inicial antes de la carga

    Imagen Final antes de la carga


    P.D. (Respuestas a tus interrogantes)

    Si filtras por nombre de producto, el numero de registros es mucho menor -> proceso mas rápido

    Cuando busca en los 17000 registros NO los busca en el sevidor, los busca en los datatables mediante LinQ

    Si solo carga 1 servidor es porque la conexión NO llega a los otros 2 servidores. Esto es tema de comunicaciones y NO hay nada que hacer salvo rezar.

    Se cargaran los servidores que tengan una conexión activa

    En definitiva con este código se cargan 20000 registros en 2 minutos y 19 segundos en la prueba efectuada.

    Espero que te sirva de algo todo esto porque el hilo se ha hecho "inmenso"

    Un saludo desde Bilbo
    Carlos


    • Marcado como respuesta BogBer21 martes, 30 de abril de 2019 19:19
    lunes, 29 de abril de 2019 21:23
  • Hola:

    excelente código sin ningún error ni nada por el estilo gracias.

    tengo esta pregunta y creo que ya te lo había comentado anteriormente: 

    ¿tengo los 4 servidores, pero uno de ellos no tiene conexión, genero la consulta de los stock, debería cargarme los stocks de los 3 servidores que tengo conexión y del otro no, por ende ese cargaría 0, pero porque solo me carga 1 el principal y los demás no?

    aquí la imagen:

    la verdad muchas gracias por toda la ayuda que me ha dado Sr. J. Carlos Herrero, nunca pensé que alguien me ayudaría de tal manera como esta gracias y bueno disculpe por tantas molestias ocasionadas pasa que también a sido el único que ha tomado de su tiempo para ayudarme.

    martes, 30 de abril de 2019 19:19
  • Hola:
    Tienes 4 servidores (3 con conexion y 1 sin conexion)
    No entiendo porque 1 servidor es el "principal",
    ¿Que diferencia a ese servidor de los otros 3?
    ¿Puedes exponer como tienes montado tu "escenario"?
    ¿Estan todos los servidores en el mismo edificio, ciudad, etc?
    No tiene ningun sentido que si 1 servidor esta desconectado, no deje conectarse a otros 2 (no se pueden leer) y si deja conectarse al "principal"
    Prueba a usar solo los 3 servidores que tienen conexión

    P.D.

    Lo que te comente anteriormente con el tipo de campo stock, si no tiene decimales debería se un campo int y si tiene decimal debería ser decimal(10,2) o algo parecido según los decimales, pero en ningún caso decimal(10,0)

    Un Saludo desde Bilbo
    Carlos


    miércoles, 1 de mayo de 2019 6:41
  • Hola: 

    le explico:

    tengo 4 servidores diferentes cada uno de ellos instalados en edificios distintos y esta distribuidos de la siguiente manera:

    • El 1er servidor lo llamo principal porque es el mas grande y me conecto a el de manera local.
    • El 2do servidor esta en otro edificio pero esta conectado a la misma red del 1er servidor por medio de una antena y por ende esta conectado de manera local también.
    • El 3ero y el 4to están cada uno en su edificio y me conecto a ellos por medio de dominios propios (Internet) de cada uno.

    Como me encuentro en Venezuela, aquí presentamos continuamente fallas de Internet y fallas de electricidad por ello perdemos conexión con los demás servidores, entonces cuando genero el código que me mando y uno de los servidores no tiene conexión sea por Internet o luz eléctrica no me cargan los demás servidores si no solamente carga el 1er servidor que esta de manera local. 

    así como esta en esta imagen:

    Un Saludo desde Venezuela.

    Muchas gracias por toda su ayuda.

    miércoles, 1 de mayo de 2019 14:50
  • Hola:
    ¿Has probado a cargar en el siguiente orden  FH - FFA - FE - FFADOS?
    Es decir carga el ultimo el que mas errores te da.
    Si NO tienes conexion, me parecea a mi que la solucion es dificil por no decir imposible (aunque yo he trabajado casi siempre en "desarrollo" por lo que no tengo conocimientos)

    Un saludo desde Bilbo
    Carlos

    miércoles, 1 de mayo de 2019 16:53
  • Hola:

    tengo que solventar los problemas de conexión a los servidores (algo un poco difícil aquí en Venezuela pero no imposible si se puede hacer).

    amigo de verdad muchas gracias por toda la ayuda que me has prestado, esfuerzo, dedicación y tiempo, vuelvo y te digo nunca pensé que me ayudarían de esta manera. de verdad muchas gracias!! tengo muchas cosas mas que quiero desarrollar pero no lo he logrado por falta de conocimiento pero igual hay que investigar. que estés bien.

    martes, 7 de mayo de 2019 14:14