Page 1 of 1
Error con ToleAuto en Harbour
Posted: Mon Aug 23, 2010 11:07 am
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.
Re: Error con ToleAuto en Harbour
Posted: Mon Aug 23, 2010 11:28 am
by Daniel Garcia-Gil
Salvador
Coloca la porcion de codigo que te genera el error, gracias
Re: Error con ToleAuto en Harbour
Posted: Mon Aug 23, 2010 1:00 pm
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.
Re: Error con ToleAuto en Harbour
Posted: Mon Aug 23, 2010 1:14 pm
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)
Re: Error con ToleAuto en Harbour
Posted: Wed Aug 25, 2010 5:21 pm
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
Re: Error con ToleAuto en Harbour
Posted: Thu Aug 26, 2010 7:18 am
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.