Spanish [SOLUCIONADO] Insertar varias filas en DB a la vez (mysql, jrd2)

RAFA BRAVO

Active Member
Licensed User
Longtime User
Deseo insertar varias filas a la vez con un único insert, trabajo con JRDC2 y mysql. He encontrado en un foro que la sentencia correcta para hacerlo es:
INSERTAR EN tbl_name (a,b,c) VALORES (1,2,3), (4,5,6), (7,8,9); Cada fila entre paréntesis y separada por comas. Pero ahora necesito cambiar mi código en la app. Este es el sub donde inserto una única fila de datos:

B4A:
Sub InsertRecord(vindatabase As String, lotebombadatabase As String, fechabombadatabase As String, fechadatabase As String, horadatabase As String, numerobombadatabase As Int, posicionBombadatabase As String, estadodatabase As String )
   
    Dim cmd As DBCommand = CreateCommand("insertRegistro2", Array( vindatabase, lotebombadatabase, fechabombadatabase, fechadatabase, horadatabase, numerobombadatabase,posicionBombadatabase,estadodatabase))
    Dim j As HttpJob = CreateRequest.ExecuteBatch(Array(cmd), Null)
    Wait For (j) jobDone(j As HttpJob)
    ProgressDialogShow("Espere porfavor...")
    If j.Success Then
       
    End If
    ProgressDialogHide
    j.Release
       
End Sub

y esta mi sentencia para una única fila: sql.insertRegistro2=insert into conmuta_bomba values (null, ?,?,?,?,?,?,?,?)

Gracias.
 

josejad

Expert
Licensed User
Longtime User
Hola Rafa:

Si no me equivoco, en este caso lo más sencillo es hacerlo con un batch. Añades todos los insert's que quieras, y luego se ejecuta todo a la vez en la base de datos.
De esta forma, no tienes que cambiar nada, te sirve para un solo insert o para muchos.

Es decir, sería algo así (No lo he probado):
B4X:
Sub InsertRecord(vindatabase As String, lotebombadatabase As String, fechabombadatabase As String, fechadatabase As String, horadatabase As String, numerobombadatabase As Int, posicionBombadatabase As String, estadodatabase As String )
   Dim Commands As List 'creas una lista para meter todo los comandos inserts

   'En los parámetros del sub, en vez de los campos de un solo insert, deberías pasar un array con todos o algo, que puedas ir recorriendo en este bucle
    For i = 0 To NumeroDeInsertsQueVayasAHacer 'O longitud del array de parámetros
        Dim cmd As DBCommand
        cmd.Initialize
        cmd.Name = "insertRegistro2" 'El nombre de tu sentencia SQL
        cmd.Parameters = Array As Object(Array( vindatabase, lotebombadatabase, fechabombadatabase, fechadatabase, horadatabase, numerobombadatabase,posicionBombadatabase,estadodatabase)) 'Aquí el array con tus parámetros, que deben variar cada bucle: (1,2,3), (4,5,6), (7,8,9)
        Commands.Add(cmd)
    Next
    Dim j As HttpJob = CreateRequest.ExecuteBatch(Array(Commands), Null) 'Aquí enviamos la lista Commands, en vez de un solo comando cmd)
    Wait For (j) jobDone(j As HttpJob)
    ProgressDialogShow("Espere porfavor...")
    If j.Success Then
    
    End If
    ProgressDialogHide
    j.Release
    
End Sub
 
Last edited:

RAFA BRAVO

Active Member
Licensed User
Longtime User
'En los parámetros del sub, en vez de los campos de un solo insert, deberías pasar un array con todos o algo, que puedas ir recorriendo en este bucle
Quieres decir que en vez de llamar al sub así:

B4A:
InsertRecord(B4XPages.MainPage.VINDato,B4XPages.MainPage.lote,B4XPages.MainPage.fechaLote,B4XPages.MainPage.fechaconmutaBomba,B4XPages.MainPage.horaconmutaBomba,B4XPages.MainPage.numeroBidon,B4XPages.MainPage.Bomba,B4XPages.MainPage.estadoBASEdatos)

Lo haga enviando un array?

No estoy seguro de como hacerlo
 

josejad

Expert
Licensed User
Longtime User
Me refiero a que si lo que quieres es grabar muchos registros de una sola vez, en vez de llamar a la sub con un solo registro, tendrás que llamarla con el listado de todos los registros que quieras agregar.

Por ejemplo, cómo lo haría yo

B4X:
'Crearía un tipo para los registros
Type TBomba ( vindatabase as Int, lotebombadatabase as String, fechabombadatabase .......)

Private Registro as TBomba
Private ListaRegistros as List

'Supongo que en algún punto, tendrás muchos registros que añadir, no sólo uno cogido de un formulario, así que esto debería ser algún tipo de bucle que recoja todos los registros que quieres insertar a la vez
While .....
Registro.vindatbase=B4XPages.MainPage.VINDato
Registro.lotebombadatabase = B4XPages.MainPage.lote
....

ListaRegistros.Add(Registro)
Wend

'Una vez agregados todos los registros a tu lista, llamarías a tu sub para agregarlos, por ejemplo:
InsertMultipleRecords(ListaRegistros)

Y ya el código de InsertMultipleRecords sería parecido al que te puse ayer.

saludos,
 
Last edited:
Top