Spanish Problema Al Enviar Varias Imágenes a MySQL

dhernandez

Active Member
Licensed User
Longtime User
Buenos dias a todos, de nuevo aqui para que me ayuden a resolver una incógnita que se me presenta...
COnfiguré el Remote DataBase Connector, para que enviara datos de un movil a MySQl remoto, entre ellos, imágenes..
Todo los hace bien en cuestion de datos y las imagenes 1 por 1, o sea, enviar un registro a la vez, se envía sin problemas.
EL problema surge, cuando desde el movil trato de enviar varios registros con 2 o más imágenes, no todos llegan a MySQL.. si envío 5 imagenes la mitad de ellso no llegan...
que estoy haciendo mal.????
el tutorial para el RDC lo tome de uno de los tutoriales de Erel.

Gracias de antemano...
 

Heppy

Active Member
Licensed User
Longtime User
Yo he desistido de hacerlo en bloque y lo hago de uno en uno.
El problema es como configurar el config.properties para hacer una sentencia tipo:

B4X:
slq.insertar_datos=Insert into TablaMySQL Select * from TablaLite

Por eso chequeo el Sub JobDone y mando registro siguiente.
 

dhernandez

Active Member
Licensed User
Longtime User
Mire, yo lo mando todo por bloque, no se hacerlo desde el config.properties para enviar uno por uno...
en el Sub JobDone como hago eso??

tambien era el factor de lo maximo entrante que permitia de datos MySQL, tenia 1 Mb y lo cambie a 200 Mb, envía todos, pero de vez en cuando, 1 no se envía...
 

Heppy

Active Member
Licensed User
Longtime User
Siento no haber respondido antes, pero ayer en Zaragoza fué fiesta, jeje
Tienes que adjuntar al proyecto la clase DBRequestManager:
http://www.b4x.com/android/forum/threads/remote-database-connector-files.31541/#content

B4X:
Sub JobDone(Job As HttpJob)
   If Job.Success = False Then
     Log("Error: " & Job.ErrorMessage)
   Else
    If Job.JobName = "DBRequest" Then
      Operacion=15
       Dim result As DBResult = reqManager.HandleJob(Job)
       For Each records() As Object In result.Rows
      RegistrosServerI=records(0)
       Next  
       Log("Inicio "&RegistrosServerI)
       If SQLIns.IsInitialized=False Then SQLIns.Initialize(File.DirRootExternal,"Mantepre/Mantepre.db",True)
       x = SQLIns.ExecQuery("SELECT * FROM Mantepre WHERE RECIBIDO=0")
       RegistrosLite=x.RowCount
       Log("Lite "&RegistrosLite)
       If x.RowCount>0 Then
        MandaRegistro(0)
       Else
         
       End If
     End If   
    Else If Operacion=15 Then   
       If x.Position<x.RowCount Then MandaRegistro(x.Position+1)
  End IF

Sub MandaRegistro(pos As Int)
 
  Dim cmd As DBCommand
  cmd.Initialize
   If pos<x.RowCount Then
    x.Position=pos
  cmd.Name = "insert_mantenimento"
  cmd.Parameters = Array As Object(Los parametros que quieras utilizar y que coincidan con config.properties)
  reqManager.ExecuteCommand(cmd, Null)
  Else
  ToastMessageShow("Proceso finalizado",True)
  Operacion=16
  End If

Lo que hago es una consulta a mi base interna y luego voy mandando registro a registro verificado por el Sun JobDone.

No sé si es muy purista, pero a mi me funciona.
 

dhernandez

Active Member
Licensed User
Longtime User
no entendi al 100% de tu código, como nunca utilizo el Sub JobDone no capto aun... :D
 

Heppy

Active Member
Licensed User
Longtime User
Si que utilizas el Sub JobDone.
Si sigues el tutorial pdf que tu subiste debes hacerlo.
Adjuntas la clase DBRequestManager al proyecto.
Lo que hago yo es un bucle para que me mande muchos registros y vuelque todos los datos, registro a registro.
A ver si me explico

Un ejemplo de lo que hago:
1 - Lo primero es saber cuantos registros tengo en la base remota para comprobar luego que he insertado todos, además es el que me inicia el bucle. Es un botón llamado btnDar
B4X:
Sub btnDar_click
  Operacion=14
  Dim cmd As DBCommand
  Dim Name As String
  cmd.Initialize
  cmd.Name = "select_mantenimiento"
  cmd.Parameters = Array As Object(Name)
  reqManager.ExecuteQuery(cmd, 0, Null)
End Sub
En el config.properties tengo:
B4X:
sql.select_mantenimiento=SELECT COUNT(*) FROM MANTEPRETEMP
Cuando esta consulta se haya ejecutado saltará a Sub JobDone y según como tenga un valor operacion, hará una cosa u otra.

B4X:
Sub JobDone(Job As HttpJob)
   If Job.Success = False Then
     Log("Error: " & Job.ErrorMessage)
   Else
  If sql1.IsInitialized=False Then sql1.Initialize(File.DirRootExternal,"Mantepre/Mantepre.db",True)
    Else If Operacion=14 Then
     If Job.JobName = "DBRequest" Then
      Operacion=15
       Dim result As DBResult = reqManager.HandleJob(Job)
       If SQLIns.IsInitialized=False Then SQLIns.Initialize(File.DirRootExternal,"Mantepre/Mantepre.db",True)
       x = SQLIns.ExecQuery("SELECT * FROM Mantepre WHERE RECIBIDO=0")
       RegistrosLite=x.RowCount
       Log("Lite "&RegistrosLite)
       If x.RowCount>0 Then
        MandaRegistro(0)
       End If
     End If   
    Else If Operacion=15 Then   
       If x.Position<x.RowCount Then MandaRegistro(x.Position+1)
    Else If Operacion=16 Then   
       Dim result As DBResult = reqManager.HandleJob(Job)
       For Each records() As Object In result.Rows
      RegistrosServerF=records(0)
       Next  
       Log("Final "&RegistrosServerF)
       If RegistrosServerF=RegistrosServerI+RegistrosLite Then
        ToastMessageShow("Registros enviados correctamente al SERVIDOR",True)
        Operacion=0
      If SQLIns.IsInitialized=False Then SQLIns.Initialize(File.DirRootExternal,"Mantepre/Mantepre.db",True)
  SQLIns.BeginTransaction
        SQLIns.ExecNonQuery("UPDATE Mantepre SET RECIBIDO=1")
        SQLIns.TransactionSuccessful
        SQLIns.EndTransaction
        SQLIns.Close
      End If
   End If
   Job.Release
End Sub

B4X:
Sub MandaRegistro(pos As Int)
  Dim cmd As DBCommand
  cmd.Initialize
   If pos<x.RowCount Then
    x.Position=pos
  cmd.Name = "insert_mantenimento"
  cmd.Parameters = Array As Object(Parametros a insertar)
  reqManager.ExecuteCommand(cmd, Null)
  Else
  Operacion=16
  Dim cmd As DBCommand
  Dim Name As String
  cmd.Initialize
  cmd.Name = "select_mantenimiento"
  cmd.Parameters = Array As Object(Name)
  reqManager.ExecuteQuery(cmd, 0, Null)
  End If     
End Sub

En Operacion=14 lo que hago es una consulta para saber los registros que quiero mandar, cambio Operacion a 15 y le digo que mande el primer registro que es la posición 0 del cursor. Y me voy a la rutina MandaRegistro, allí incremento la posicion del cursor en 1. Mientras If x.Position<x.RowCount Then MandaRegistro(x.Position+1) mandaré registros y cuando no se cumpla esa condición Operacion será 16,con lo que he terminado y comprueba el resultado final para comprobar que he insertado todos los registros.
Recuerda cada vez que uses el reqManager.ExecuteQuery o reqManagr.executeCommand, siempre saltará a JobDone para decirte si ha sido correcto o ha fallado.

Espero no haberte liado más.
 

dhernandez

Active Member
Licensed User
Longtime User
buen dia Heppy ymuchas gracias por tu respuesta...
Lo hice todo y esta funcionando perfectamente, las imagenes siguen sin enviarse todas...
lo curioso del caso es que se mandan los registros... te explico..

registro 1;
NombreImagen | HoraDeToma | FechaDeToma | LugarDeToma | Imagen
Imagen 1 | 17:20:05 | 13-03-2014 | Sala de Juntas | Blob OK
Imagen 2 | 17:22:15 | 13-03-2014 | Area del Site | Blob OK
Imagen 3 | 17:25:00 | 13-03-2014 | Sala de Juntas 2| Sin Blob

envío 3 registro y todas llegan a MySQL, pero al realizar la consulta, 1 de los registros no tiene imagen...
y si esa consulta lo realizo en SQLite, la imagen esta ahi....

Algo esta fallando en la configuracion de PHPMyADMIN...
No se como arreglarlo :(
 

Descartex

Well-Known Member
Licensed User
Longtime User
Mira a ver si tienes un límite de subida de archivos en php... en el phpinfo() te lo indica... puede ir por ahi el problema...
 

dhernandez

Active Member
Licensed User
Longtime User
gracia descartex, estoy checandolo, lo que modifique fue en my.ini de MySQL, la linea de max_allowed_packet, lo tenia a 1M y lo subi a 200M,, pero aun asi no se solucionó..
alguna otra ayuda??
 

Descartex

Well-Known Member
Licensed User
Longtime User
en el php, no en mysql... el problema puede ser q el php no te admita transmitir archivos de mas de x tamaño, aunque la base de datos mysql te deje guardarlos, no los llega a recibir, puesto que el conector es el php.
 

dhernandez

Active Member
Licensed User
Longtime User
ese archivo, donde lo ecuentro? ya que estuve buscandolo en la carpeta de phpmyadmin y no encontre nada parecido, o de perdis numeros como 2M 20 etc...
 

Descartex

Well-Known Member
Licensed User
Longtime User
crea un php q unicamente ponga phpinfo() y mira la información que te muestra...
Luego, para cambiarla, has de entrar en las opciones de tu hosting. Si necesitas ayuda con ello, seguramente te pueda ayudar.

Un saludo.
 

dhernandez

Active Member
Licensed User
Longtime User
Muchas gracias por tu ayuda, he buscado indicios del archivo y le he encontrado y modificado-... funciona ya correctamente
 
Top