Error con ToleAuto en Harbour

Post Reply
Salvador
Posts: 142
Joined: Sun Dec 18, 2005 3:18 pm
Location: España

Error con ToleAuto en Harbour

Post by Salvador »

Una aplicación en Harbour que hace frecuentes updates a una BD de SQL me genera el siguiente error de manera aleatoria:

Code: Select all

-------------------- Internal Error Handling Information  ---------------------

Subsystem Call ....: WINOLE
System Code .......: 1007
Default Status ....: .F.
Description .......: Argument error
Operation .........: UPDATE
Arguments .........: 
Involved File .....: 
Dos Error Code ....: -2147352567 (FFFFFFFF80020009)

 Trace Through:
----------------
TOLEAUTO:UPDATE      :Line:       0 in Module:
Conoce alguien el motivo de este error ?.

Gracias de antemano.
Saludos
Salvador
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

Re: Error con ToleAuto en Harbour

Post by Daniel Garcia-Gil »

Salvador

Coloca la porcion de codigo que te genera el error, gracias
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
Salvador
Posts: 142
Joined: Sun Dec 18, 2005 3:18 pm
Location: España

Re: Error con ToleAuto en Harbour

Post by Salvador »

Se genera el error de manera aleatoria, aveces después de grabar hasta 7000 registros.
Se conectan hasta 200 clientes simultáneamente, cada cliente es atendido en un thread diferente.

Code: Select all

///////////////////////////////////////////////////////////////////////////////////////////////
// Almacena en la tabla vehiculos la ultima posición si es posterior 
//
METHOD InsertPos( cFecha, cHora, cId, cImei, cLatDec, cLonDec, cKmHora, cFix, lAlarma, lStop, DO1, DO2 ) CLASS TServer

if ::oRs:RecordCount() >0 
    if cId == cImei 
        ::oRs:Find("iduser = '"+cId+"'"  )
        else // 
            ::oRs:Find("imei = '"+cImei+"'"  ) 
    endif       
endif           

if (!::oRs:Eof() .and. !::oRs:Bof() )

  if( dTos( cTod( Left( cFecha, 8 ) ) ) + cHora ) >;
    ( dTos( ::oRs:Fields("fecha"):Value )+;
     ::oRs:Fields("hora"):Value )     

     ::oRs:Fields("fecha"):Value         := cFecha
     ::oRs:Fields("hora"):Value          := cHora 
     ::oRs:Fields("velocidad"):Value     := cKmHora
     ::oRs:Fields("stop"):Value          := lStop
     ::oRs:Fields("latitud"):Value       := cLatDec
     ::oRs:Fields("longitud"):Value      := cLonDec
     ::oRs:Fields("fix"):Value           := cFix
     ::oRs:Fields("alarma"):Value        := lAlarma
     ::oRs:Fields("DO1"):Value          := DO1
     ::oRs:Fields("DO2"):Value          := DO2
     ::oRs:Update()
  endif   
endif
return nil
 
El recordset se abre desde aqui:

Code: Select all

METHOD oPenRecordSet() CLASS TServer

// abrimos los recordsets antes de procesar los paquetes de datos
// recordset de vehiculos
::oRs:=tOleAuto():New("ADODB.RecordSet")
::oRs:CursorLocation   := adUseClient
::oRs:CursorType       := adOpenDynamic
::oRs:LockType         := adLockOptimistic
::oRs:ActiveConnection := ::oApp:oCnnLocator
::oRs:Source           := "SELECT * FROM VEHICULOS ORDER BY iduser"
::oRs:Open()
return nil
 
Daniel gracias por tu interés.
Saludos
Salvador
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

Re: Error con ToleAuto en Harbour

Post by Daniel Garcia-Gil »

puede que el problema venga de un valor erroneo (un valor nil, fecha en blanco, etc ) que quieras asignar a uno de _
has un logfile con los datos antes de asignarlos y despues verifica los valores al momento de la caida
::oRs:Fields("fecha"):Value := cFecha
::oRs:Fields("hora"):Value := cHora
::oRs:Fields("velocidad"):Value := cKmHora
::oRs:Fields("stop"):Value := lStop
::oRs:Fields("latitud"):Value := cLatDec
::oRs:Fields("longitud"):Value := cLonDec
::oRs:Fields("fix"):Value := cFix
::oRs:Fields("alarma"):Value := lAlarma
::oRs:Fields("DO1"):Value := DO1
::oRs:Fields("DO2"):Value := DO2
ADO es bastante estricto y algunas veces hasta dificil de depurar (mi opinion personal)
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
Salvador
Posts: 142
Joined: Sun Dec 18, 2005 3:18 pm
Location: España

Re: Error con ToleAuto en Harbour

Post by Salvador »

Leyendo los errores de Ado me dice:

Code: Select all

Description: No se puede encontrar la fila para su actualización: algunos valores han cambiado desde la última vez que se leyó.
Native error:         32
Error number:          -2147217864
Error source: Microsoft Cursor Engine
 
Parece ser que varios clientes modifican el mismo registro al mismo tiempo, de momento así:

Code: Select all

::oRs:ReSync( adAffectCurrent,adResyncAllValues )
 
::oRs:Fields("fecha"):Value         := cFecha
::oRs:Fields("hora"):Value          := cHora 
::oRs:Fields("velocidad"):Value     := cKmHora
::oRs:Fields("stop"):Value          := lStop
::oRs:Fields("latitud"):Value       := cLatDec
::oRs:Fields("longitud"):Value      := cLonDec
::oRs:Fields("fix"):Value           := cFix
::oRs:Fields("alarma"):Value        := lAlarma
::oRs:Fields("DO1"):Value           := DO1
::oRs:Fields("DO2"):Value           := DO2
::oRs:Update()
 
Parece funcionar siempre que la concurrencia no sea excesiva
Saludos
Salvador
Salvador
Posts: 142
Joined: Sun Dec 18, 2005 3:18 pm
Location: España

Re: Error con ToleAuto en Harbour

Post by Salvador »

"Mi gozo en un pozo".
Sigue dando el mismo error aunque solo hay dos clientes accediendo al mismo registro.

Code: Select all

::oRs:ReSync( adAffectCurrent,adResyncAllValues )
Parece no funcionar o no está utilizada correctamente.
Saludos
Salvador
Post Reply