none
Transferir registros de una base de datos a otra [Solucionado] RRS feed

  • Pregunta

  • Que tal.

    Estoy trabajando con vb.net y access.

    En mi programa me pidieron que se pueda transferir los datos de una base a otra de manera local y entonces cree una función que hace una consulta (son dos tablas una llamada Clientes y otra Grupos):

    Fich es un OpenFileDialog que de forma más visual le permite al usuario escoger la base de datos y los My.setting son variables donde el programa siempre las recordará esta explicación es solo por si acaso hay duda pero esto no es el punto de todos modos. 

    Para transferir los grupos:

        Public Sub transferirGrupos()
            Using cnn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & My.Settings.DireccionBase & "\" & My.Settings.NombreBase)
    
                Dim sql As String = "INSERT INTO Grupos SELECT Grupos.* FROM Grupos IN '" & Fich.FileName & "'"
    
                Try
                    Dim cmd As New OleDb.OleDbCommand(sql, cnn)
    
                Catch ex As Exception
                    MessageBox.Show(ex.Message)
    
                End Try
    
            End Using
    
        End Sub

    Para transferir los clientes:

    Public Sub transferir()
            Using cnn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & My.Settings.DireccionBase & "\" & My.Settings.NombreBase)
    
                Dim sql As String = "INSERT INTO Clientes SELECT Clientes.* FROM Clientes IN '" & Fich.FileName & "'"
    
                Try
                    Dim cmd As New OleDb.OleDbCommand(sql, cnn)
    
                Catch ex As Exception
                    MessageBox.Show(ex.Message)
    
                End Try
    
            End Using
        End Sub   

    Y lo hace bien si trasfieres de una tabla llena de registros a la otra base de datos donde sus tablas no tengan nada pero si por ejemplo se vuele hacer sale el siguiente error:

    

    Es porque uso claves primarias e investigue al respecto tengo que identificar las tablas con variables para poder hacer los siguiente:

    Dim sql As String = "INSERT INTO Grupos SELECT DISTINCT it.grupos FROM Grupos it IN '" & Fich.FileName & "' WHERE NOT EXIST (SELECT 1 FROM Grupos I WHERE (it.grupos = I.grupos))"

    (Sí, la tabla se llama grupos y el campo grupos jaja).

    Pero me sale:

    Operación invalida, se cerrará la conexión.

    También hay otra forma de identificar las tablas con "AS" pero tampoco me funciona así.

    ¿Porqué no me funciona? o ¿Alguien sabe de otra forma de lograr esto?

    Habia hecho otra forma de pasar los registros y era haciendo un FOR y comprobando campo por campo pasar si es igual no pasarlo a la otra base, no lo sobre escribiera pero tengo pasar a veces como 100,000 registros y comprobando de uno por uno tarda demasiado y como a los 500 o 800 registros (siempre es de forma variable) me salia error o a veces Out of memory (trate de hacerlos con background worker para aligerar el proceso pero aún así continuaba igual).

    Con la consulta se demasiado rápido y no sucede error si no existe clientes o grupos repetidos.

    Gracias por su ayuda.


    Lento pero seguro.




    • Editado Wipo sábado, 2 de marzo de 2019 0:56
    lunes, 18 de febrero de 2019 0:30

Respuestas

  • Hola:
    En un Form como el de la imagen


    Copia y pega el siguiente código

    Option Strict On
    Option Explicit On
    Imports System.Data.OleDb
    Public Class FrmCarga
        Private msCadenaOrigen As String
        Private msCadenaDestino As String
        Private mdtOrigen As New DataTable
        Private mdtDestino As New DataTable
        Private Sub FrmCarga_Load(sender As Object, e As EventArgs) Handles Me.Load
            'Añadimos las columnas.
            mdtDestino.Columns.Add(New DataColumn("id", Type.GetType("System.Int16")))
            mdtDestino.Columns.Add(New DataColumn("nombre", Type.GetType("System.String")))
            ContextMenuStrip = cmenu
        End Sub
        Private Sub AceptarToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AceptarToolStripMenuItem.Click
            If txtBDDestino.Text.Length = 0 Or txtBDOrigen.Text.Length = 0 Then
                MessageBox.Show("Hay que seleccionar 2 bases de datos")
                Return
            End If
            AceptarToolStripMenuItem.Visible = False
            Cursor = Cursors.WaitCursor
            Try
                'Establecemos una conexión con la base de datos de origen
                Using loConexion As New OleDbConnection(msCadenaOrigen)
                    ' Especificamos la consulta SQL que ejecutará el comando.
                    Dim lsQuery As String = "SELECT * FROM clientes"
                    Dim loDataTable As New DataTable
                    Dim loDataAdapter As New OleDbDataAdapter(lsQuery, loConexion)
                    loDataAdapter.Fill(mdtOrigen)
                End Using
                'cargar datatable con los valores que NO existan en la tabla de destino
                For Each Fila As DataRow In mdtOrigen.Rows
                    If lF_bExiste(CInt(Fila.Item("id"))) = False Then
                        lP_Añadir(CInt(Fila.Item("id")), CStr(Fila.Item("nombre")))
                    End If
                Next
                'Cargar la tabla de Access con el mdtDestino
                lP_DataTableToTable()
            Catch ex As Exception
                Cursor = Cursors.Default
                MessageBox.Show(ex.Message)
            End Try
            Cursor = Cursors.Default
        End Sub
        Private Sub lP_Añadir(ByVal id As Integer, ByVal nombre As String)
            Dim lDataRow As DataRow = mdtDestino.NewRow
            ' Añadimos los datos
            lDataRow.Item("id") = id
            lDataRow.Item("nombre") = nombre
            ' Agregamos el registro a la colección Rows
            mdtDestino.Rows.Add(lDataRow)
        End Sub
        Private Sub SalirToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles SalirToolStripMenuItem.Click
            Close()
        End Sub
        Private Sub btnPathOrigen_Click(sender As System.Object, e As System.EventArgs) Handles btnPathOrigen.Click
            Try
                With dlgAbrirArchivo
                    ' Comprobar que el archivo seleccionado existe. El cuadro de diálogo muestra una advertencia en caso contrario.
                    .CheckFileExists = True
                    ' Comprobar que la ruta de acceso seleccionada existe. El cuadro de diálogo muestra una advertencia en caso contrario.
                    .CheckPathExists = True
                    ' Obtener o establecer una extensión predeterminada. No incluye el "." inicial.
                    .DefaultExt = "accdb"
                    .Filter = "Ficheros ACCDB (*.accdb)|*.accdb"
                    .Multiselect = False
                    ' ¿Restaurar el directorio original después de seleccionar un archivo? Si False, el directorio actual cambia al directorio en el que seleccionó el archivo.
                    ' Establézcalo como True para poner la carpeta actual de nuevo donde estaba cuando comenzó.
                    .RestoreDirectory = True
                    .Title = "Seleccione el Fichero"
                    ' ¿Aceptar sólo nombres de archivo Win32 válidos?
                    .ValidateNames = True
                    If .ShowDialog = Windows.Forms.DialogResult.OK Then
                        txtBDOrigen.Text = .FileName
                        If txtBDDestino.Text.Length > 0 Then
                            AceptarToolStripMenuItem.Visible = True
                        Else
                            AceptarToolStripMenuItem.Visible = False
                        End If
                        msCadenaOrigen = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & txtBDOrigen.Text
                    End If
                End With
            Catch ex As Exception
                MessageBox.Show(ex.Message, "btnPathOrigen_Click", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub
        Private Sub btnPathDestino_Click(sender As System.Object, e As System.EventArgs) Handles btnPathDestino.Click
            Try
                With dlgAbrirArchivo
                    ' Comprobar que el archivo seleccionado existe. El cuadro de diálogo muestra una advertencia en caso contrario.
                    .CheckFileExists = True
                    ' Comprobar que la ruta de acceso seleccionada existe. El cuadro de diálogo muestra una advertencia en caso contrario.
                    .CheckPathExists = True
                    ' Obtener o establecer una extensión predeterminada. No incluye el "." inicial.
                    .DefaultExt = "accdb"
                    .Filter = "Ficheros ACCDB (*.accdb)|*.accdb"
                    .Multiselect = False
                    ' ¿Restaurar el directorio original después de seleccionar un archivo? Si False, el directorio actual cambia al directorio en el que seleccionó el archivo.
                    ' Establézcalo como True para poner la carpeta actual de nuevo donde estaba cuando comenzó.
                    .RestoreDirectory = True
                    .Title = "Seleccione el Fichero"
                    ' ¿Aceptar sólo nombres de archivo Win32 válidos?
                    .ValidateNames = True
                    If .ShowDialog = Windows.Forms.DialogResult.OK Then
                        txtBDDestino.Text = .FileName
                        If txtBDOrigen.Text.Length > 0 Then
                            AceptarToolStripMenuItem.Visible = True
                        Else
                            AceptarToolStripMenuItem.Visible = False
                        End If
                        msCadenaDestino = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & txtBDDestino.Text
                    End If
                End With
            Catch ex As Exception
                MessageBox.Show(ex.Message, "btnPathDestino_Click", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub
        Private Function lF_bExiste(ByVal viId As Integer) As Boolean
            Dim liResultado As Integer
            Try
                Using loConexion As New OleDbConnection(msCadenaDestino)
                    Dim lsQuery As String = "SELECT Count(*) FROM clientes WHERE id=@Id"
                    Using loComando As New OleDbCommand(lsQuery, loConexion)
                        Dim loParametro As OleDbParameter
                        loParametro = New OleDbParameter("@Id", OleDbType.Integer)
                        loParametro.Value = viId
                        loComando.Parameters.Add(loParametro)
                        loConexion.Open()
                        liResultado = CInt(loComando.ExecuteScalar())
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return CBool(IIf(liResultado = 0, False, True))
        End Function
        Private Sub lP_DataTableToTable()
            Try
                Using loConexion As New OleDbConnection(msCadenaDestino)
                    Dim loDataAdapter As OleDbDataAdapter = New OleDbDataAdapter("SELECT * FROM clientes", loConexion)
                    Dim cmdBuilder As New OleDbCommandBuilder(loDataAdapter)
                    loDataAdapter.Update(mdtDestino)
                End Using
            Catch ex As Exception
                Throw ex
            End Try
        End Sub
    End Class
    Los datos iniciales son

    El resultado final es

    Un saludo desde Bilbo
    Carlos



    sábado, 23 de febrero de 2019 22:16

Todas las respuestas

  • Hola wipo

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, te hago la recomendación de ingresar al siguiente enlace en donde puedes encontrar una posible solución para tu problema.

    https://social.msdn.microsoft.com/Forums/es-ES/f85c3b00-d05b-4a32-bd81-855c8fb19a4f/importar-datos-de-una-base-de-datos-a-otra-en-vbnet?forum=vbes

    https://support.office.com/es-es/article/exportar-un-objeto-de-base-de-datos-a-otra-base-de-datos-de-access-4e2cd6dd-e482-441e-88b5-aa5319a428a6

    Gracias por usar los foros de MSDN.

    Pedro Alfaro


    lunes, 18 de febrero de 2019 20:51
    Moderador
  • Perdone la tardanza.

    Mire el segundo link y si funcionaria pero el usuario quisiera que fuera automático el proceso además que no es todas sus computadoras tendrían access pero de igual forma algún día se me presente este caso.

    Con respecto al segundo, usan sql y algunas consultas de sql no funciona en access como la de abrir otras bases en el mismo equipo como lo hace sql.

    En ese mismo link se encuentra el siguiente codigo hecho por gasgdl2:

    Public con As New SqlConnection("Data Source=192.168.1.171;" _
    + " Initial Catalog=INVENTARIO;User Id=sa;Password=gas1505")
    
    Public con2 As New SqlConnection("Data Source=DESKTOP\SQLEXPRESS;" _
    + " Initial Catalog=SIMEI;Integrated Security=True")
    
    ahora abro las 2 conecciones
    
    If con.State = 0 Then con.Open()
    If con2.State = 0 Then con2.Open()
    
            Dim NTabla As DataTable
            Dim i As Integer
            Dim a_cod, descripcion, a_int, a_pais, a_unid As String
            Dim a_prec As Single
    
            mySQL = "SELECT * FROM catalogo"
    
            '***AQUI TRABAJO CON LA PRIMER CONECCION QUE ES DE DONDE HAGO LA CONSULTA
            '
            Dim dt As New SqlDataAdapter(mySQL, con)
            Dim ds As New DataSet
            dt.Fill(ds, "miTabla")
            NTabla = ds.Tables("miTabla")
    
            i = 0
            If NTabla.Rows.Count > 0 Then
                For Each row As DataRow In NTabla.Rows
                    Dim miFila As DataRow = NTabla.Rows.Item(i) 'Item(0) trae el primer renglon de la factura
                    a_cod = miFila("codigo")
                    a_int = miFila("cod_interno")
                    descripcion = miFila("descripcion")
                    a_prec = miFila("precio")
                    If descripcion.Length > 49 Then descripcion = Left(descripcion, 49)
                    'descripcion = Replace(descripcion, "'", "''")
    
                    If miFila("unidad") IsNot DBNull.Value Then
                        a_unid = miFila("unidad")
                    Else
                        a_unid = ""
                    End If
    
                    If miFila("pais") IsNot DBNull.Value Then
                        a_pais = miFila("pais")
                    Else
                        a_pais = ""
                    End If
    
                    Dim oCom As Data.SqlClient.SqlCommand
    
                    '***AQUI ESCRIBO EN LA TABLA DE LA 2A CONECCION
                    '
                    oCom = con2.CreateCommand
    
                    oCom.CommandType = CommandType.Text
                    oCom.CommandText = "INSERT INTO catalogo " _
                    & "(codigo, cod_interno, descripcion, unidad, pais, precio)" _
                    & "VALUES (@cod, @cdi, @desc, @uni, @pais, @precio)"
    
    lo demas es mas logico y obvio pero si tienes dudas, con gusto
    
    ahora cierro las conecciones
    
    If con.State = 1 Then con.Close()
    If con2.State = 1 Then con2.Close()

    Y ese es el que me refería en mi pregunta pero tarda demasiado y también es el que me generaba el error después de pasar como 800 registros.

    Con la forma que hago la verdad es bastante rápido solo que falta identificar que no se repitan los registros y todavía no encuentro como es que access pueda permitir esto.

    Gracias por responder.


    Lento pero seguro.

    miércoles, 20 de febrero de 2019 3:18
  • Hola Wipo:

    Para que no se repitan los registros en la insercción no te los traigas repetidos. Cambia

    mySQL = "SELECT * FROM catalogo"

    por

    mySQL = "SELECT DISTINCT * FROM catalogo"

    Entonces ya serán diferentes.

    Ya he visto que sabes como hacerlo, pero no entiendo muy bien porque no lo has implementado así.

    miércoles, 20 de febrero de 2019 5:10
  • Es que distinc solo funciona en una tabla pero no sé puede saber si en la otra tabla está repetida. 

    En accesos no encuentro mucho al respecto para hacer esto. ¿ Alguien más tiene una idea?

    Gracias 


    Lento pero seguro.

    sábado, 23 de febrero de 2019 1:56
  • Hola:
    En un Form como el de la imagen


    Copia y pega el siguiente código

    Option Strict On
    Option Explicit On
    Imports System.Data.OleDb
    Public Class FrmCarga
        Private msCadenaOrigen As String
        Private msCadenaDestino As String
        Private mdtOrigen As New DataTable
        Private mdtDestino As New DataTable
        Private Sub FrmCarga_Load(sender As Object, e As EventArgs) Handles Me.Load
            'Añadimos las columnas.
            mdtDestino.Columns.Add(New DataColumn("id", Type.GetType("System.Int16")))
            mdtDestino.Columns.Add(New DataColumn("nombre", Type.GetType("System.String")))
            ContextMenuStrip = cmenu
        End Sub
        Private Sub AceptarToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AceptarToolStripMenuItem.Click
            If txtBDDestino.Text.Length = 0 Or txtBDOrigen.Text.Length = 0 Then
                MessageBox.Show("Hay que seleccionar 2 bases de datos")
                Return
            End If
            AceptarToolStripMenuItem.Visible = False
            Cursor = Cursors.WaitCursor
            Try
                'Establecemos una conexión con la base de datos de origen
                Using loConexion As New OleDbConnection(msCadenaOrigen)
                    ' Especificamos la consulta SQL que ejecutará el comando.
                    Dim lsQuery As String = "SELECT * FROM clientes"
                    Dim loDataTable As New DataTable
                    Dim loDataAdapter As New OleDbDataAdapter(lsQuery, loConexion)
                    loDataAdapter.Fill(mdtOrigen)
                End Using
                'cargar datatable con los valores que NO existan en la tabla de destino
                For Each Fila As DataRow In mdtOrigen.Rows
                    If lF_bExiste(CInt(Fila.Item("id"))) = False Then
                        lP_Añadir(CInt(Fila.Item("id")), CStr(Fila.Item("nombre")))
                    End If
                Next
                'Cargar la tabla de Access con el mdtDestino
                lP_DataTableToTable()
            Catch ex As Exception
                Cursor = Cursors.Default
                MessageBox.Show(ex.Message)
            End Try
            Cursor = Cursors.Default
        End Sub
        Private Sub lP_Añadir(ByVal id As Integer, ByVal nombre As String)
            Dim lDataRow As DataRow = mdtDestino.NewRow
            ' Añadimos los datos
            lDataRow.Item("id") = id
            lDataRow.Item("nombre") = nombre
            ' Agregamos el registro a la colección Rows
            mdtDestino.Rows.Add(lDataRow)
        End Sub
        Private Sub SalirToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles SalirToolStripMenuItem.Click
            Close()
        End Sub
        Private Sub btnPathOrigen_Click(sender As System.Object, e As System.EventArgs) Handles btnPathOrigen.Click
            Try
                With dlgAbrirArchivo
                    ' Comprobar que el archivo seleccionado existe. El cuadro de diálogo muestra una advertencia en caso contrario.
                    .CheckFileExists = True
                    ' Comprobar que la ruta de acceso seleccionada existe. El cuadro de diálogo muestra una advertencia en caso contrario.
                    .CheckPathExists = True
                    ' Obtener o establecer una extensión predeterminada. No incluye el "." inicial.
                    .DefaultExt = "accdb"
                    .Filter = "Ficheros ACCDB (*.accdb)|*.accdb"
                    .Multiselect = False
                    ' ¿Restaurar el directorio original después de seleccionar un archivo? Si False, el directorio actual cambia al directorio en el que seleccionó el archivo.
                    ' Establézcalo como True para poner la carpeta actual de nuevo donde estaba cuando comenzó.
                    .RestoreDirectory = True
                    .Title = "Seleccione el Fichero"
                    ' ¿Aceptar sólo nombres de archivo Win32 válidos?
                    .ValidateNames = True
                    If .ShowDialog = Windows.Forms.DialogResult.OK Then
                        txtBDOrigen.Text = .FileName
                        If txtBDDestino.Text.Length > 0 Then
                            AceptarToolStripMenuItem.Visible = True
                        Else
                            AceptarToolStripMenuItem.Visible = False
                        End If
                        msCadenaOrigen = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & txtBDOrigen.Text
                    End If
                End With
            Catch ex As Exception
                MessageBox.Show(ex.Message, "btnPathOrigen_Click", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub
        Private Sub btnPathDestino_Click(sender As System.Object, e As System.EventArgs) Handles btnPathDestino.Click
            Try
                With dlgAbrirArchivo
                    ' Comprobar que el archivo seleccionado existe. El cuadro de diálogo muestra una advertencia en caso contrario.
                    .CheckFileExists = True
                    ' Comprobar que la ruta de acceso seleccionada existe. El cuadro de diálogo muestra una advertencia en caso contrario.
                    .CheckPathExists = True
                    ' Obtener o establecer una extensión predeterminada. No incluye el "." inicial.
                    .DefaultExt = "accdb"
                    .Filter = "Ficheros ACCDB (*.accdb)|*.accdb"
                    .Multiselect = False
                    ' ¿Restaurar el directorio original después de seleccionar un archivo? Si False, el directorio actual cambia al directorio en el que seleccionó el archivo.
                    ' Establézcalo como True para poner la carpeta actual de nuevo donde estaba cuando comenzó.
                    .RestoreDirectory = True
                    .Title = "Seleccione el Fichero"
                    ' ¿Aceptar sólo nombres de archivo Win32 válidos?
                    .ValidateNames = True
                    If .ShowDialog = Windows.Forms.DialogResult.OK Then
                        txtBDDestino.Text = .FileName
                        If txtBDOrigen.Text.Length > 0 Then
                            AceptarToolStripMenuItem.Visible = True
                        Else
                            AceptarToolStripMenuItem.Visible = False
                        End If
                        msCadenaDestino = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & txtBDDestino.Text
                    End If
                End With
            Catch ex As Exception
                MessageBox.Show(ex.Message, "btnPathDestino_Click", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub
        Private Function lF_bExiste(ByVal viId As Integer) As Boolean
            Dim liResultado As Integer
            Try
                Using loConexion As New OleDbConnection(msCadenaDestino)
                    Dim lsQuery As String = "SELECT Count(*) FROM clientes WHERE id=@Id"
                    Using loComando As New OleDbCommand(lsQuery, loConexion)
                        Dim loParametro As OleDbParameter
                        loParametro = New OleDbParameter("@Id", OleDbType.Integer)
                        loParametro.Value = viId
                        loComando.Parameters.Add(loParametro)
                        loConexion.Open()
                        liResultado = CInt(loComando.ExecuteScalar())
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return CBool(IIf(liResultado = 0, False, True))
        End Function
        Private Sub lP_DataTableToTable()
            Try
                Using loConexion As New OleDbConnection(msCadenaDestino)
                    Dim loDataAdapter As OleDbDataAdapter = New OleDbDataAdapter("SELECT * FROM clientes", loConexion)
                    Dim cmdBuilder As New OleDbCommandBuilder(loDataAdapter)
                    loDataAdapter.Update(mdtDestino)
                End Using
            Catch ex As Exception
                Throw ex
            End Try
        End Sub
    End Class
    Los datos iniciales son

    El resultado final es

    Un saludo desde Bilbo
    Carlos



    sábado, 23 de febrero de 2019 22:16
  • Lamento la demora, con la escuela no me da tiempo para programar.

    Mire tu código y me asuste un poco jaja pero lo organizé en mi proyecto pero por una cosa u otra no pude hacer que funcionará pero me quede con tu idea sobre como verificar los registros y pasarlos.

    Primero lleno en un dataset nuevo la tabla que quiero copiar, le agrego datatable, datarow, etc.

    Public Sub transferirGrupos()
            Dim dsBaseT As New DataSet
            Dim conexionbdT As String = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & Fich.FileName
            Dim cnnT As New OleDb.OleDbConnection
            Dim adaptadorGruposT As New OleDb.OleDbDataAdapter
            Dim tablaGruposT As DataTable
            Dim rowGruposT As DataRow
            Dim constructorGruposT As OleDb.OleDbCommandBuilder
    
            Dim i As Double
    
            Dim rowCollection As DataRowCollection = tablaGrupos.Rows
            Dim foundRow As DataRow
            Dim buscarClaves As Object() = New Object(1) {}
    
            Try
                cnnT = New OleDb.OleDbConnection(conexionbdT)
                cnnT.Open()
    
                dsBaseT = New DataSet()
    
                adaptadorGruposT = New OleDb.OleDbDataAdapter("SELECT * FROM Grupos", cnnT)
    
                adaptadorGruposT.MissingSchemaAction = MissingSchemaAction.AddWithKey
                adaptadorGruposT.Fill(dsBaseT, "Grupos")
    
                tablaGruposT = dsBaseT.Tables("Grupos")
                cnnT.Close()
    
                rowGruposT = tablaGruposT.NewRow()
    
                constructorGruposT = New OleDb.OleDbCommandBuilder(adaptadorGruposT)
    
                constructorGruposT.ConflictOption = ConflictOption.OverwriteChanges
    
                'Pasar grupos
    
                For i = 0 To tablaGruposT.Rows.Count - 1
    
                    buscarClaves(0) = tablaGruposT.Rows(i).Item(0).ToString
                    buscarClaves(1) = tablaGruposT.Rows(i).Item(1).ToString
    
                    foundRow = rowCollection.Find(buscarClaves)
    
                    If foundRow Is Nothing Then
                        rowGrupos = tablaGrupos.NewRow()
    
                        rowGrupos("Grupos") = tablaGruposT.Rows(i).Item(0).ToString
                        rowGrupos("Nombre_del_Grupo") = tablaGruposT.Rows(i).Item(1).ToString
                        rowGrupos("Nombre_Encargada") = tablaGruposT.Rows(i).Item(2).ToString
                        rowGrupos("Telefono_Encargada") = tablaGruposT.Rows(i).Item(3).ToString
                        rowGrupos("Direccion_Encargada") = tablaGruposT.Rows(i).Item(4).ToString
                        rowGrupos("Colonia_Encargada") = tablaGruposT.Rows(i).Item(5).ToString
                        rowGrupos("Nombre_Supervisora") = tablaGruposT.Rows(i).Item(6).ToString
                        rowGrupos("Telefono_Supervisora") = tablaGruposT.Rows(i).Item(7).ToString
                        rowGrupos("Direccion_Supervisora") = tablaGruposT.Rows(i).Item(8).ToString
                        rowGrupos("Colonia_Supervisora") = tablaGruposT.Rows(i).Item(9).ToString
    
                        tablaGrupos.Rows.Add(rowGrupos)
                        adaptadorGrupos.Update(tablaGrupos)
                    End If
    
                Next i
    
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
    
        End Sub

    y para los clientes decidí hacer lo mismo pero tenia el mismo problema cuando abrí este problema, tarda demasiado y ademas me da error pero como los clientes no importa que se repitan hice los siguiente:

    Public Sub transferirClientes()
            Using cnn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & My.Settings.DireccionBase & "\" & My.Settings.NombreBase)
    
                Dim sql As String = "INSERT INTO Clientes (Grupo, Nombre_del_grupo, Fecha, Nombre, Direccion, Colonia, Telefono, Garantia1, Garantia2, Prestamo, Abono, Nombre_Aval, Direccion_Aval, Colonia_Aval, Telefono_Aval, Garantia1_Aval, Garantia2_Aval, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, Total) SELECT Grupo, Nombre_del_grupo, Fecha, Nombre, Direccion, Colonia, Telefono, Garantia1, Garantia2, Prestamo, Abono, Nombre_Aval, Direccion_Aval, Colonia_Aval, Telefono_Aval, Garantia1_Aval, Garantia2_Aval, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, Total FROM Clientes IN '" & Fich.FileName & "'"
    
                Try
                    Dim cmd As New OleDb.OleDbCommand(sql, cnn)
    
                    cnn.Open()
    
                    cmd.ExecuteNonQuery()
     
                    cnn.Close()
    
                Catch ex As Exception
                    MessageBox.Show(ex.Message)
    
                End Try
    
            End Using
        End Sub

    De esta forma con una consulta SQL los paso omitiendo la columna Id que es un autonumérico y puede repetirse entre base de datos y ya quedo.

    Gracias por responder y de tomarte el tiempo de hacer el código, se aprecia mucho y perdón por tardar.


    Lento pero seguro.


    • Editado Wipo domingo, 3 de marzo de 2019 0:06
    sábado, 2 de marzo de 2019 0:56