Visual Basic.NET - Rapidez en Grabación

 
Vista:
Imágen de perfil de Carlos
Val: 112
Ha disminuido 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Rapidez en Grabación

Publicado por Carlos (41 intervenciones) el 29/07/2020 23:17:18
Muy buenas:
Tengo una Base de datos mdb, que en total entre sus tablas hay unos 600.000 registros, los he pasado a csv, y una de ellas que tiene 50.000 Registros tarda 4h 30m, y la que tiene 280.000 registros va a tardar unas 18h, en pasarlos, lo he intentado tanto desde cvs, txt, como desde la propia mdb, y todos tardan lo mismo, el destino es una BD sqlite, he intentado lo siguiente casos:

Caso A
For x =0 to Lineas del Archivo
1º.- Abrir conexión
2º.- Leer el archivo csv,txt
3º.- Grabar el registro
4º.- Cerrar conexion
next

Caso B
Abrir conexión
Bucle For
Leer el archivo
Grabar Registro
Fin de bucle
Cerrar conexión

Caso C
Begin Trasancción
abrir conexión
Bucle For
Leer el archivo
Grabar Registro
Fin de bucle
Fin Transacción
Cerrar conexión

Por todo esto la importación de todos los datos me va a llevar una 30horas sin parar, sin embargo he visto que hay software de terceros, por ejemplo ESF Database Migration Toolkit - Pro (32-bit) (de pago), que puede traspasar los 50.000 rgtos en unos 4 minutos; por mas que he mirado no veo como poder aligerar ese tiempo, el cliente no puede estar inoperativo tanto tiempo.
Ahora mismo llevo 7h30' y ha pasado 113055 registros y me quedan otros 167.000 Registros.

Sugiero ideas para poder hacer esta incorporación lo mas rapidamente posible, ahora mismo lo que hago es
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
' Abro la mdb y veo la Tabla Historico de Expedientes
 
    CadenaSelect = "SELECT * FROM Hist_Expte"
    If commandString = "" Then
        commandString = CadenaSelect
    End If
 
    Try
        DbConnection.Open()
    Catch e As Exception
        MessageBox.Show("Error al crear la conexión:" + vbCrLf + e.Message)
        Exit Sub
    End Try
 
    Dim dbDataSet = New Data.DataSet()
    Dim DbDataAdapter = New OleDbDataAdapter(commandString, DbConnection)
    Dim dt As DataTable = Nothing
    Try
        DbDataAdapter.Fill(dbDataSet, "Hist_Expte")
        dt = dbDataSet.Tables("Hist_Expte")
    Catch ex As Exception
        MessageBox.Show("Error al recuperar datos de la tabla:" + vbCrLf + ex.Message)
    End Try
    DGTabla.DataSource = dt
    DbConnection.Close()
 
'Creo la conexión a Sqlite
    Dim conn As New SQLiteConnection(Con1)
    conn.Open()
    Dim sql As String = ""
    For x As Integer = 0 To DGTabla.Rows.Count - 1 'Recorre la DGTabla de acces
'Contador del registro por el que va
        Label1.Text = CStr(x + 1) + "/" + CStr(DGTabla.Rows.Count)
'Asigno las variables
        cManual = DGTabla.Rows(x).Cells(0).Value.ToString
        cFecha = DGTabla.Rows(x).Cells(1).Value.ToString
        cUsuario = DGTabla.Rows(x).Cells(3).Value.ToString
        cMotivo = DGTabla.Rows(x).Cells(4).Value.ToString
        cExplica = DGTabla.Rows(x).Cells(5).Value.ToString
        cExplica = Replace(cExplica, "'", "")
        cOpen = DGTabla.Rows(x).Cells(6).Value.ToString
        Try
            sql = "INSERT INTO Hist_Expte (Id_Expediente, FechaRgto,Usuario,Motivo,Explica,Open_Close) VALUES(@param1, @param2, @param3,@param4, @param5, @param6)"
            Dim cmdGuardar As SQLiteCommand = New SQLiteCommand(sql, conn)
            cmdGuardar.Parameters.AddWithValue("@param1", cManual)
            cmdGuardar.Parameters.AddWithValue("@param2", cFecha)
            cmdGuardar.Parameters.AddWithValue("@param3", cUsuario)
            cmdGuardar.Parameters.AddWithValue("@param4", cMotivo)
            cmdGuardar.Parameters.AddWithValue("@param5", cExplica)
            cmdGuardar.Parameters.AddWithValue("@param6", cOpen)
' Ejecutamos la sql
            cmdGuardar.ExecuteNonQuery()
 
        Catch ex As Exception
            MessageBox.Show("No se han actualizado los datos" & vbCrLf & ex.Message)
        End Try
        DGTabla.CurrentCell = DGTabla.Rows(x).Cells(0)
        My.Application.DoEvents()
    Next
    conn.Close()
End If
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de melqui
Val: 643
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Rapidez en Grabación

Publicado por melqui (242 intervenciones) el 30/07/2020 00:24:51
por lo que veo lo estas haciendo de forma insert
mas eso es necesario que trabajes con BULK INSERT, que será mas rapido digo unos 2hs depende de la cantidad
yo acabe trabajando 890mil registros la hice en menos de 2hs.
mas eso va depender de como estas trabajando la mia fue en red. que complica mucho en produccion
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Carlos
Val: 112
Ha disminuido 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Rapidez en Grabación

Publicado por Carlos (41 intervenciones) el 30/07/2020 08:39:30
Gracias por tu respuesta; podrias poner un ejemplo de como hacerlo, para insertar esos registros, en mi caso tambien se hara la importación en una Red de Area Local, y las pruebas las estoy haciendo en Local, así que no se cuanto tiempo puede llevar.

Saludos desde España (Algeciras)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Rapidez en Grabación

Publicado por Phil Rob (1554 intervenciones) el 30/07/2020 16:10:04
Hola,

No tengo tiempo para testar pero hago los comentarios siguiente ...

Pienso que los parámetros pueden ser escritos ante la cicla y en este caso, puedes suprimir el Try (Try toma mucho tiempo).

Por favor, intenta :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
' ... ... ...
            Dim cmdGuardar As SQLiteCommand = New SQLiteCommand(sql, conn)
            cmdGuardar.Parameters.AddWithValue("@param1", cManual)
            cmdGuardar.Parameters.AddWithValue("@param2", cFecha)
            cmdGuardar.Parameters.AddWithValue("@param3", cUsuario)
            cmdGuardar.Parameters.AddWithValue("@param4", cMotivo)
            cmdGuardar.Parameters.AddWithValue("@param5", cExplica)
            cmdGuardar.Parameters.AddWithValue("@param6", cOpen)
' ... ... ...
    For x As Integer = 0 To DGTabla.Rows.Count - 1 'Recorre la DGTabla de acces
'Contador del registro por el que va
        Label1.Text = CStr(x + 1) + "/" + CStr(DGTabla.Rows.Count)
'Asigno las variables
        cManual = DGTabla.Rows(x).Cells(0).Value.ToString
        cFecha = DGTabla.Rows(x).Cells(1).Value.ToString
        cUsuario = DGTabla.Rows(x).Cells(3).Value.ToString
        cMotivo = DGTabla.Rows(x).Cells(4).Value.ToString
        cExplica = DGTabla.Rows(x).Cells(5).Value.ToString
        cExplica = Replace(cExplica, "'", "")
        cOpen = DGTabla.Rows(x).Cells(6).Value.ToString
'''        Try
            sql = "INSERT INTO Hist_Expte (Id_Expediente, FechaRgto,Usuario,Motivo,Explica,Open_Close) VALUES(@param1, @param2, @param3,@param4, @param5, @param6)"
' ... ... ...
' Ejecutamos la sql
            cmdGuardar.ExecuteNonQuery()
 
'''        Catch ex As Exception
'''            MessageBox.Show("No se han actualizado los datos" & vbCrLf & ex.Message)
'''        End Try
        DGTabla.CurrentCell = DGTabla.Rows(x).Cells(0)   ' Es necesario ???
        My.Application.DoEvents()    ' Es necesario ???
    Next
' ... ... ...

No es necesario de poner los datos en DataGridView ante escribir en la DB. Este será mejor asi :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
' ... ... ...
    Dim dbDataSet = New Data.DataSet()
    Dim DbDataAdapter = New OleDbDataAdapter(commandString, DbConnection)
    Dim dt As DataTable = Nothing
    Try
        DbDataAdapter.Fill(dbDataSet, "Hist_Expte")
        dt = dbDataSet.Tables("Hist_Expte")
    Catch ex As Exception
        MessageBox.Show("Error al recuperar datos de la tabla:" + vbCrLf + ex.Message)
    End Try
'''    DGTabla.DataSource = dt     ' Utilizar dt en la cicla
    DbConnection.Close()
 
'Creo la conexión a Sqlite
    Dim conn As New SQLiteConnection(Con1)
    conn.Open()
    Dim sql As String = ""
' ... ... ...
            Dim cmdGuardar As SQLiteCommand = New SQLiteCommand(sql, conn)
            cmdGuardar.Parameters.AddWithValue("@param1", cManual)
            cmdGuardar.Parameters.AddWithValue("@param2", cFecha)
            cmdGuardar.Parameters.AddWithValue("@param3", cUsuario)
            cmdGuardar.Parameters.AddWithValue("@param4", cMotivo)
            cmdGuardar.Parameters.AddWithValue("@param5", cExplica)
            cmdGuardar.Parameters.AddWithValue("@param6", cOpen)
' ... ... ...
    For x As Integer = 0 To DGTabla.Rows.Count - 1 'Recorre la DGTabla de acces
'Contador del registro por el que va
        Label1.Text = CStr(x + 1) + "/" + CStr(DGTabla.Rows.Count)
'Asigno las variables
        cManual = dt.Rows(x).Items(0).ToString       ' en este ejemplo, utilizo indicio 0, pero debes corregir segun el caso o escribir el nombre del campo (ej. "Manual")
        cFecha = dt.Rows(x).Items(1).ToString
        cUsuario = dt.Rows(x).Items(3).ToString
        cMotivo = dt.Rows(x).Items(4).ToString
        cExplica = dt.Rows(x).Items(5).ToString
        cExplica = Replace(cExplica, "'", "")
        cOpen = dt.Rows(x).Items(6).ToString
'''        Try
            sql = "INSERT INTO Hist_Expte (Id_Expediente, FechaRgto,Usuario,Motivo,Explica,Open_Close) VALUES(@param1, @param2, @param3,@param4, @param5, @param6)"
' ... ... ...
' Ejecutamos la sql
            cmdGuardar.ExecuteNonQuery()
 
'''        Catch ex As Exception
'''            MessageBox.Show("No se han actualizado los datos" & vbCrLf & ex.Message)
'''        End Try
        DGTabla.CurrentCell = DGTabla.Rows(x).Cells(0)   ' Es necesario ???
        My.Application.DoEvents()    ' Es necesario ???
    Next
' ... ... ...
    conn.Close()
 
 ' y si necesario, escribes aqui la frase :  DGTabla.DataSource = dt

Espero te dar una buena idea ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Carlos
Val: 112
Ha disminuido 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Rapidez en Grabación

Publicado por Carlos (41 intervenciones) el 30/07/2020 17:26:51
Muy buenas Phil:
En primer lugar gracias por tu consejo; he cambiado el codigo por el propuesto por ti, para hacer las pruebas: pero no me graba nada en la B.D. Sqlite, te dejo copia de como ha quedado.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
If CheckBox3.Checked = True Then
    CadenaSelect = "SELECT * FROM Hist_Expte" '----->Tabla de Access
    If commandString = "" Then
        commandString = CadenaSelect
    End If
 
    Try
        DbConnection.Open()
    Catch e As Exception
        MessageBox.Show("Error al crear la conexión:" + vbCrLf + e.Message)
        Exit Sub
    End Try
    Dim dbDataSet = New Data.DataSet()
    '
    Dim DbDataAdapter = New OleDbDataAdapter(commandString, DbConnection)
    Dim dt As DataTable = Nothing
    Try
        DbDataAdapter.Fill(dbDataSet, "Hist_Expte")
        dt = dbDataSet.Tables("Hist_Expte")
    Catch ex As Exception
        MessageBox.Show("Error al recuperar datos de la tabla:" + vbCrLf + ex.Message)
    End Try
 
    DGTabla.DataSource = dt
    DbConnection.Close()
    ProgressBar1.Minimum = 0
    ProgressBar1.Maximum = DGTabla.Rows.Count - 1
    Label1.Text = "1" + "/" + CStr(DGTabla.Rows.Count)
 
    Dim conn As New SQLiteConnection(Con1)
    conn.Open()
    Dim sql As String = ""
    Dim cmdGuardar As SQLiteCommand = New SQLiteCommand(sql, conn)
    cmdGuardar.Parameters.AddWithValue("@param1", cManual)
    cmdGuardar.Parameters.AddWithValue("@param2", cFecha)
    cmdGuardar.Parameters.AddWithValue("@param3", cUsuario)
    cmdGuardar.Parameters.AddWithValue("@param4", cMotivo)
    cmdGuardar.Parameters.AddWithValue("@param5", cExplica)
    cmdGuardar.Parameters.AddWithValue("@param6", cOpen)
 
    For x As Integer = 0 To DGTabla.Rows.Count - 1
        If ProgressBar1.Value < ProgressBar1.Maximum Then
            ProgressBar1.Value += 1
            If ProgressBar1.Value = ProgressBar1.Maximum Then
                MsgBox("Finalizada Importación!")
            End If
        End If
        Label1.Text = "Registro=" + CStr(x + 1) '+ "/" + CStr(DGTabla.Rows.Count)
        cManual = dt.Rows(x).Item("Expediente").ToString
        cFecha = dt.Rows(x).Item("Fecha").ToString
        If cFecha <> "" Then
            cFecha = Mid(cFecha, 7, 4) + "/" + Mid(cFecha, 4, 2) + "/" + Mid(cFecha, 1, 2)
 
' He probado en quitar el valor de la Hora pero sigue sin grabar
            If dt.Rows(x).Item("Hora").ToString = "" Then
                cHorIni = "00:00:00"
            Else
                cHorIni = Mid(dt.Rows(x).Item("Hora").ToString, 12, 8)
            End If
            cFecha = Convert.ToDateTime(cFecIni + " " + cHorIni)
        End If
        cUsuario = dt.Rows(x).Item("Id_Inspector").ToString '----> graba en la variable el valor del Campo
        cMotivo = dt.Rows(x).Item("Motivo").ToString
        cExplica = dt.Rows(x).Item("Explica").ToString
        cExplica = Replace(cExplica, "'", "")
        cOpen = dt.Rows(x).Item("Cerrado").ToString
        If cOpen = "N" Then
            cOpen = "O"
        Else
            cOpen = "C"
        End If
        sql = "INSERT INTO Hist_Expte (Id_Expediente, FechaRgto,Usuario,Motivo,Explica,Open_Close) VALUES(@param1, @param2, @param3,@param4, @param5, @param6)"
        cmdGuardar.ExecuteNonQuery() '----->Parece ser que no graba nada
        My.Application.DoEvents() '------> Puesto simplemente para ver por que registro va
    Next
    conn.Close()
End If

Viendo que no grababa nada en la BD le he activado el Try Catch End Try, para ver si habia algun error y no lo hay, pero no Graba nada

He cambiado la linea sql = "INSERT INTO Hist_Expte (Id_Expediente, FechaRgto,Usuario,Motivo,Explica,Open_Close) VALUES(@param1, @param2, @param3,@param4, @param5, @param6)" por esta otra
cmdGuardar.CommandText = "INSERT INTO Hist_Expte (Id_Expediente, FechaRgto,Usuario,Motivo,Explica,Open_Close) VALUES(@param1, @param2, @param3,@param4, @param5, @param6)"
Asi si graba pero sale una media de 400Rgtos por minuto, nos vamos a unas 11.66horas en Local, cuando se haga en Red, ni idea
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Rapidez en Grabación

Publicado por Phil Rob (1554 intervenciones) el 30/07/2020 17:55:38
He hecho error en mi codigo anterior ...

Sin DataGridView, tienes que cambiar la cicla :

1
For x As Integer = 0 To dt.Rows.Count - 1

Sin DGV, el DGV.Rows.Count igual 0. Este es la razón que no escribe los registros.

Este el codigo correcto :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
' ... ... ...
    Dim dbDataSet = New Data.DataSet()
    Dim DbDataAdapter = New OleDbDataAdapter(commandString, DbConnection)
    Dim dt As DataTable = Nothing
    Try
        DbDataAdapter.Fill(dbDataSet, "Hist_Expte")
        dt = dbDataSet.Tables("Hist_Expte")
    Catch ex As Exception
        MessageBox.Show("Error al recuperar datos de la tabla:" + vbCrLf + ex.Message)
    End Try
'''    DGTabla.DataSource = dt     ' Utilizar dt en la cicla
    DbConnection.Close()
 
'Creo la conexión a Sqlite
    Dim conn As New SQLiteConnection(Con1)
    conn.Open()
    Dim sql As String = ""
' ... ... ...
            Dim cmdGuardar As SQLiteCommand = New SQLiteCommand(sql, conn)
            cmdGuardar.Parameters.AddWithValue("@param1", cManual)
            cmdGuardar.Parameters.AddWithValue("@param2", cFecha)
            cmdGuardar.Parameters.AddWithValue("@param3", cUsuario)
            cmdGuardar.Parameters.AddWithValue("@param4", cMotivo)
            cmdGuardar.Parameters.AddWithValue("@param5", cExplica)
            cmdGuardar.Parameters.AddWithValue("@param6", cOpen)
' ... ... ...
    For x As Integer = 0 To dt.Rows.Count   'Recorre la DGTabla de acces
'Contador del registro por el que va
        Label1.Text = CStr(x + 1) + "/" + CStr(DGTabla.Rows.Count)
'Asigno las variables
        cManual = dt.Rows(x).Items(0).ToString       ' en este ejemplo, utilizo indicio 0, pero debes corregir segun el caso o escribir el nombre del campo (ej. "Manual")
        cFecha = dt.Rows(x).Items(1).ToString
        cUsuario = dt.Rows(x).Items(3).ToString
        cMotivo = dt.Rows(x).Items(4).ToString
        cExplica = dt.Rows(x).Items(5).ToString
        cExplica = Replace(cExplica, "'", "")
        cOpen = dt.Rows(x).Items(6).ToString
'''        Try
            sql = "INSERT INTO Hist_Expte (Id_Expediente, FechaRgto,Usuario,Motivo,Explica,Open_Close) VALUES(@param1, @param2, @param3,@param4, @param5, @param6)"
' ... ... ...
' Ejecutamos la sql
            cmdGuardar.ExecuteNonQuery()
 
'''        Catch ex As Exception
'''            MessageBox.Show("No se han actualizado los datos" & vbCrLf & ex.Message)
'''        End Try
        DGTabla.CurrentCell = DGTabla.Rows(x).Cells(0)   ' Es necesario ???
        My.Application.DoEvents()    ' Es necesario ???
    Next
' ... ... ...
    conn.Close()
 
 ' y si necesario, escribes aqui la frase :  DGTabla.DataSource = dt

Este deberi ser mas rápido.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Carlos
Val: 112
Ha disminuido 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Rapidez en Grabación

Publicado por Carlos (41 intervenciones) el 30/07/2020 18:24:31
Buenas de nuevo:
he cambiado la cabecera del Bucle por

1
For x as integer=0 to dt.rows.count -1

Sigue sin grabar ningun registro, leer los lee, ademas el contador me dice por donde va pero no crea ni un registro en la BD, si sacamos del bloque For ..Next esto no crea ningun registro

1
2
3
4
5
6
7
Dim cmdGuardar As SQLiteCommand = New SQLiteCommand(sql, conn)
cmdGuardar.Parameters.AddWithValue("@param1", cManual)
cmdGuardar.Parameters.AddWithValue("@param2", cFecha)
cmdGuardar.Parameters.AddWithValue("@param3", cUsuario)
cmdGuardar.Parameters.AddWithValue("@param4", cMotivo)
cmdGuardar.Parameters.AddWithValue("@param5", cExplica)
cmdGuardar.Parameters.AddWithValue("@param6", cOpen)

y si lo pongo dentro del bucle los crea pero ha una media de unos 400Rgts por minuto

Gracias y sigo esperando solución, saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Rapidez en Grabación

Publicado por Phil Rob (1554 intervenciones) el 30/07/2020 18:43:21
Si escribes los parámetros (con el NEW) en la cicla, este es necesario de escribir cmdGuardar.Dispose() ante la linea Next :
No es posible de hace tan muchas nuevas instancias ...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
' ... ... ...
    For x As Integer = 0 To dt.Rows.Count   'Recorre la DGTabla de acces
 
            Dim cmdGuardar As SQLiteCommand = New SQLiteCommand(sql, conn)
            cmdGuardar.Parameters.AddWithValue("@param1", cManual)
            cmdGuardar.Parameters.AddWithValue("@param2", cFecha)
            cmdGuardar.Parameters.AddWithValue("@param3", cUsuario)
            cmdGuardar.Parameters.AddWithValue("@param4", cMotivo)
            cmdGuardar.Parameters.AddWithValue("@param5", cExplica)
            cmdGuardar.Parameters.AddWithValue("@param6", cOpen)
 
'Contador del registro por el que va
        Label1.Text = CStr(x + 1) + "/" + CStr(DGTabla.Rows.Count)
'Asigno las variables
        cManual = dt.Rows(x).Items(0).ToString       ' en este ejemplo, utilizo indicio 0, pero debes corregir segun el caso o escribir el nombre del campo (ej. "Manual")
        cFecha = dt.Rows(x).Items(1).ToString
        cUsuario = dt.Rows(x).Items(3).ToString
        cMotivo = dt.Rows(x).Items(4).ToString
        cExplica = dt.Rows(x).Items(5).ToString
        cExplica = Replace(cExplica, "'", "")
        cOpen = dt.Rows(x).Items(6).ToString
'''        Try
            sql = "INSERT INTO Hist_Expte (Id_Expediente, FechaRgto,Usuario,Motivo,Explica,Open_Close) VALUES(@param1, @param2, @param3,@param4, @param5, @param6)"
' ... ... ...
' Ejecutamos la sql
            cmdGuardar.ExecuteNonQuery()
 
'''        Catch ex As Exception
'''            MessageBox.Show("No se han actualizado los datos" & vbCrLf & ex.Message)
'''        End Try
'''        DGTabla.CurrentCell = DGTabla.Rows(x).Cells(0)   ' Es necesario ???
'''        My.Application.DoEvents()    ' Es necesario ???
 
cmdGuardar.Dispose()
 
    Next
' ... ... ...

...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Carlos
Val: 112
Ha disminuido 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Rapidez en Grabación

Publicado por Carlos (41 intervenciones) el 30/07/2020 18:56:36
Muy buenas:

Gracias por la ayuda, pero sigue a la misma velocidad de unos 400Rgt/minuto. Sigo viendo porque algo debe de haber ya que he probado con Software privado, (en plan demo) y es capaz de grabar 50000Rgtos en 4 minutos.
Ademas he visto que DB Browser (Sqlite), es capaz de migrar un archivo csv a la tabla en menos de 2minutos. El problema es que donde se va usar sus conocimientos de informatica son 0, y ademas Access no es capaz de exportar mas de 65Regitros a un archivo csv, por lo que habria que dividir la tabla en 5 y exportarlas 1 a 1.

Sigo bicheando hasta que de con la tecla, el amigo Melqui, sugiere usar la orden Bulk Insert, estoy viendo ese tema tambien pero aún no lo pillo, para vb.net

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Rapidez en Grabación

Publicado por Phil Rob (1554 intervenciones) el 30/07/2020 22:39:28
Lo siento de no poder te ayudar …
Suerte para tu buscada.

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Carlos
Val: 112
Ha disminuido 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Rapidez en Grabación

Publicado por Carlos (41 intervenciones) el 30/07/2020 22:54:43
Muy buenas:

Nada de sentirlo, MUCHAS GRACIAS, por tus molestias, siempre se aprende algo, y de ti he visto otra forma de usar las instrucciones Sql, repito muchas gracias

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Rapidez en Grabación

Publicado por Phil Rob (1554 intervenciones) el 31/07/2020 13:06:57
Hola,

Leyendo tu código, comprendo que :

• Lees tabla Hist_Expte en DB Access y lees todos campos (SELECT * FROM Hist_Expte)
• No están modificados los datos entre la lectura y la escritura.
• Escribes tabla Hist_Expte en DB SqLite. Escribes algunos campos (INSERT …. Id_Expediente, FechaRgto,Usuario,Motivo,Explica,Open_Close).

Quiero intentar de escribir un programa que hace esto y solo esto.

Para crear los DB, me gustaría saber :
• Todos los nombres y tipos de la tabla Hist_Expte en Access.
• Todos los nombres y tipos de la tabla Hist_Expte en SqLite.

Si das me estas informaciones, podaría reflexionar a este programa el lunes, quizá mas temprano.

No garantizo resultados ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Carlos
Val: 112
Ha disminuido 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Rapidez en Grabación

Publicado por Carlos (41 intervenciones) el 31/07/2020 17:55:08
Muy buenas:

Efectivamente lo que hago es leer de la Tabla Hist_Expte de la mdb, lo paso a las variables y estas las incorporo a la Hist_Expte de la Sqlite, sin mas

Los campos son indenticos en ambas Bd de datos y la estructura es

Id_Expediente Varchar(12) Not Null
FechaRgto Varchar() Not Null
Id_Usuario Varchar(40) Not Null
Motivo Varchar(20) Not Null
Explica VarChar(240) Not Null
Open_Close Varchar(1) Not Null

Y no tiene clave ya que se pueden repetir registros con igual nº de Expediente.
Esta Tabla en la mdb tiene actualmente 280185 Registros y para cuando tenga que hacer la importación de una a otra puede llegar a los 400.000 Rgtos

Saludos y espero esa rutina como el llover; (sigo bicheando por Internet y haciendo pruebas pero por ahora es negativo lo mas que he conseguido es una tasa de unos 400Rgt/min en Local)

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Rapidez en Grabación

Publicado por Phil Rob (1554 intervenciones) el 31/07/2020 18:04:17
Gracias para la respuesta.

Miraré este ....

Buenas tardes,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Rapidez en Grabación

Publicado por Phil Rob (1554 intervenciones) el 03/08/2020 12:31:19
Hola,

Como he dicho, he trabajado esta mañana para escribir un programa que copia un tabla de Access hasta SqLite.

He escrito el código para llenar la tabla Access con 100000 registros (Escritura de los registros en la tabla : 87 segundos).
He intentado de leer la tabla Access y de lo copiar en la tabla SqLite. Más de 30 minutos para escribir ± 2000 registros. He terminado la ejecución.

Para comprender, he intentado de crear los registros directamente en SqLite (como he hecho con Access). He tenido el mismo problema que para copiar. Más de 30 minutos para escribir ± 2000 registros. He terminado la ejecución.

Ultimo prueba, he copiado la tabla Access con 100000 registros en una tabla de otro DB Access (Lectura de los registros de un DB y escritura en la tabla de otro DB : 88 segundos).

Conclusión :

Crear 100000 registros en un DB Access : no problema, duración 87 segundos.
Leer 100000 registros en un DB Access y los escribir en segundo DB Access : no problema, duración 88 segundos.
Crear los 100000 registros en un DB SqLite : no parece posible.
Leer los 100000 registros en un DB Access y los escribir en DB SqLite : no parece posible.

Quizá SqLite no es bien para este trabajo.
Nuca he utilizado SqLite (excepto pequeñas pruebas). Quizá que es necesario de ajustar parámetros …, no sé.
Quizá puedes intentar de crear 100000 registros directamente en SqLite con este codigo :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Private Sub AgregarRegistrosEnSqLite()
    Dim ComandoSQL As String = ""
    Dim MiComando As New SQLiteCommand
 
    ConexionSqLite.ConnectionString = CadenaConexionParaSqLite   ' ECRIBES AQUI TU ConnectionString
    ConexionSqLite.Open()
 
    Dim cManual As String = ""
    Dim cFecha As String = ""
    Dim cUsuario As String = ""
    Dim cMotivo As String = ""
    Dim cExplica As String = ""
    Dim cOpen As String = ""
 
' Verificar que no existen errores con nombres de los campos
    ComandoSQL = "INSERT INTO Hist_Expte (Id_Expediente, FechaRgto, Id_Usuario, Motivo ,Explica, Open_Close) VALUES (@param1, @param2, @param3,@param4, @param5, @param6)"
 
    MiComando.Connection = ConexionSqLite
    MiComando.CommandType = CommandType.Text
    MiComando.CommandText = ComandoSQL
 
    For I As Integer = 1 To 100000
        cManual = "T_" & I.ToString
        cFecha = "01/08/2020"
        cUsuario = "U_" & I.ToString
        cMotivo = "Mot_" & I.ToString
        cExplica = "Explica_" & I.ToString
        cOpen = (I Mod 2).ToString
 
        MiComando.Parameters.AddWithValue("@param1", cManual)
        MiComando.Parameters.AddWithValue("@param2", cFecha)
        MiComando.Parameters.AddWithValue("@param3", cUsuario)
        MiComando.Parameters.AddWithValue("@param4", cMotivo)
        MiComando.Parameters.AddWithValue("@param5", cExplica)
        MiComando.Parameters.AddWithValue("@param6", cOpen)
 
        MiComando.ExecuteNonQuery()
        MiComando.Parameters.Clear()
 
    Next
    MiComando.Dispose()
    ConexionSqLite.Close()
    ConexionSqLite.Dispose()
    MessageBox.Show("Registros agregados")
End Sub

Para Javier Medrano y su trabajo con 2 DB Access, tengo un ejemplo, lo enviaré en la tarde.

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Carlos
Val: 112
Ha disminuido 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Rapidez en Grabación

Publicado por Carlos (41 intervenciones) el 03/08/2020 12:46:32
Muy buenas:

Muchas gracias por las molestias que te has tomado en tratar de ver como se podría realizar este proceso, intentare jugar con los valores de PRAGMA, para ver si doy con la tecla; entiendo que alguna forma ha de existir cuando DB Browser (Sqlite) es capaz de pasar esos registros en menos de 4 minutos, desde un archivo csv, pero que en definitiva en algun momento ha de usar la Clausula INSERT para incorporarlos.

Si doy con la tecla no dudes en que te diré como lo he hecho, espero tener suerte.

Y de nuevo agradecerte las molestias que te has tomado.

Saludos desde Algeciras de Carlos Ramos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Rapidez en Grabación

Publicado por Phil Rob (1554 intervenciones) el 03/08/2020 18:24:13
Para el caso donde este ti seria utile ...
Este tarde, he hecho la prueba de copiar los 100000 registros de Access en un DB SQLExpress : duration 55 segundos. Mas rapido que copiar de un DB Access en un DB Access.

Buenas tardes a Algeciras
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Carlos
Val: 112
Ha disminuido 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Rapidez en Grabación

Publicado por Carlos (41 intervenciones) el 03/08/2020 19:21:58
Muy buenas:

Me podrias pasar el codigo completo para plantearme otra serie de opciones, para ver como poder realilzar ese proceso.

Gracias y saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Carlos
Val: 112
Ha disminuido 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Rapidez en Grabación

Publicado por Carlos (41 intervenciones) el 03/08/2020 23:42:24
Muy buenas:

¡¡¡¡ Lo conseguí !!!!, 425.326 Registros importados desde la mdb a Sqlite

Tenia como cadena de conexión esto

1
Public Con1 As New SQLiteConnection("Data source=" & RutaBaseDato & "; version=3; ")

dandome una tasa de Transferencia Real de 385 Registros por minuto

y la he cambiado por esta Otra

1
Public Con1 As New SQLiteConnection("Data source=" & RutaBaseDato & "; version=3; Pooling=True; Synchronous=Off; journal mode=Memory")

dandome una media de 85.065,2 Registros por minuto

Gracias a Todos y en especial a Phil Rob por su disposición.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Rapidez en Grabación

Publicado por Phil Rob (1554 intervenciones) el 04/08/2020 08:08:25
Hola,

Tienes razon !
Con tu nueva cadena de conexión en mi programa, copio los 100000 registros de Access en SqLite en 10 segundos. Extraordinario !

Quizá tienes que revisar tu código porque 85000 registros por minuto no me parece bastan rápido.
No olvida de Clear los parametros :

1
2
cmdGuardar.ExecuteNonQuery()
cmdGuardar.Parameters.Clear

Que tenga un buen dia !

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar