Vikthor:
Yo uso ADS en forma extensa, y hasta ahora no e tenido ese mensaje de error (espero no tenerlo nunca).
Por lo que entiendo del mensaje, la cadena/string cQuery es muy grande.
Por que no pruebas dividiéndola.
Otra alternativa seria crear procedimientos almacenados, para que realicen la mayor parte de la tarea.
Aca te dejo una funciones que a mi me ayudan en el trabajo:
- Code: Select all Expand view
STATIC lError
STATIC nError
STATIC cError
//--------------------------//
Function SQL_Error()
return lError
//--------------------------//
Function SQL_nError()
return nError
//--------------------------//
Function SQL_cError()
return cError
//--------------------------//
Function SQL_nErrorSubCode()
return if(nError=0,0,Val(SubStr(cError,At("NativeError",cError)+14,4)))
//--------------------------//
//Ejecuta una comando SQL: INSERT, UPDATE, etc..., al final cierra el area
Function SQL_Command(cSql, nConnect)
local nAreaAnterior := Select()
local lOk := .F.
lError := .F.
nError := 0
cError := ""
DBSelectArea( 0 )
if ADSCreateSQLStatement('SQL_Command', AdsSetFileType(), nConnect)// 1=ADS_NTX, 2=ADS_CDX, 3=ADS_ADT
if ADSExecuteSQLDirect( cSql )
lOk := .T.
else
lError := .T.
nError := AdsGetLastError(@cError)
LogFile( ".\sqlerror.log", { "SQL_Command()", "ADSExecuteSQLDirect: "+cError, cSql} )
if SQL_nErrorSubCode()=2102//Data truncated
lOk := .T.
endif
endif
DbCloseArea()
//AdsCloseSQLStatement()
else
lError := .T.
nError := AdsGetLastError(@cError)
LogFile( ".\sqlerror.log", { "SQL_Command()", "AdsCreateSqlStatement: "+cError} )
endif
DBSelectArea( nAreaAnterior )
Return lOk
//--------------------------//
//Devuelve una consulta/cursor/tabla SQL: Select * from... , no cierra el area al final
Function SQL_Cursor(cSql, cAlias, nConnect)
local lOk := .F.
DEFAULT cAlias := cSAUROGetNewAlias( "SQL" )
if Valtype(cAlias)="N" //el parametro pasado es una area NO un alias
if cAlias > 0
DBSELECTAREA( cAlias ) //Seleccionamos el area especificada
if Used()
cAlias:=Alias(cAlias)
DbCloseArea() //antes de volverla a abrir la cerramos; porque si la dejamos abierta se produce un error
else
cAlias:=cSAUROGetNewAlias( "SQL" )
endif
else
DBSELECTAREA( 0 )
cAlias:=cSAUROGetNewAlias( "SQL" )
endif
else
DBSELECTAREA( Select(cAlias) ) //Si "cAlias" ya esta abierta en un area, la volveremos a abrir en la misma area.
//Si el alias no esta abierta, Select(cAlias) devuelve 0 y seleccionamos el area 0
if Used()
DbCloseArea() //antes de volverla a abrir la cerramos; porque si la dejamos abierta se produce un error
endif
endif
lError := .F.
nError := 0
cError := ""
if ADSCreateSQLStatement(cAlias, AdsSetFileType(), nConnect)// 1=ADS_NTX, 2=ADS_CDX, 3=ADS_ADT
if ADSExecuteSQLDirect( cSql )
lOk := .T.
else
lError := .T.
nError := AdsGetLastError(@cError)
LogFile( ".\sqlerror.log", { "SQL_Cursor()", "ADSExecuteSQLDirect: "+cError, cSql} )
DbCloseArea()
//AdsCloseSQLStatement()
endif
else
lError := .T.
nError := AdsGetLastError(@cError)
LogFile( ".\sqlerror.log", { "SQL_Cursor()", "AdsCreateSqlStatement: "+cError} )
endif
Return lOk
Atentamente,
Rolando
Cochabamba, Bolivia