Page 1 of 2

Ayuda con Objeto Stream de ADO (Solucionado)

PostPosted: Wed Jul 08, 2015 4:09 am
by sjingo
Saludos foro

Nuevamente, aquí en busca de su ayuda.

Como ya lo he comentado en otro post, tenía funcionando si problemas una aplicación que cargaba una imagen desde archivo lo cargaba a un objeto Stream y mediante este lo asignaba a un campo blob en una tabla mysql. Mas o menos en resumen lo hacía así:
Code: Select all  Expand view


//::oStream := TOleAuto():New("adodb.stream")
::oStream := win_OleCreateObject( "ADODB.Stream" )
::oStream:Type := 1 //adTypeBinary

::oStream:Open()
//cargo la foto desde un archivo al objeto
::oStream:LoadFromFile(cfile)  

//Creo el nuevo recordset
oRsFoto:Addnew()
oRsFoto:fields('cod_veh'):Value := ::oRsV:Fields('cod_veh'):Value
oRsFoto:Fields('fecha'):Value := fecha
oRsFoto:Fields('nota'):Value := nota

try
      //Coloco la foto en el campo
    oRsfoto:fields('foto'):Value = ::oStream:Read(-1)
catch oError
    MsgInfo( "SEND01 NO : " + ";" + CRLF+ ;
    "Message: " + oError:Description )
    //MsgStop("Problemas al colocar la fotografía en su respectivo campo")
    //ShowError(oError,oCon)
end

//actualizamos el recordset
oRsFoto:Update()
::oStream:Close()


Todo esto me funcionaba sin contratiempos antes de actualizarme, pero ahora al momento de hacer
oRsfoto:fields('foto'):Value = ::oStream:Read(-1)
obtengo el error que me da en oError:Description : "Argument Error"

Esto me trae de cabeza desde hace tiempo, y no encuentro la solución.
Pienso que ::oStream:LoadFromFile(cfile) , no está cargando adecuadamente el fichero, por lo que al ser pasado en oRsfoto:fields('foto'):Value = ::oStream:Read(-1) no es un archivo válido. Pero no sé como comprobarlo, estoy perdido.

Intenté usar un ejemplo que hallé aqui en el foro:
oRsfoto:Fields("foto"):AppendChunk( VTArrayWrapper():New( 17, cBUFFER ) ) // cBUFFER contiene bytes leidos desde un fichero de imagen
Pero tuve problemas con la función VTArrayWrapper, que me parece que no es de harbour, así que probé:
oRsfoto:Fields("foto"):AppendChunk( cBUFFER )
y si graban bytes a la tabla pero no como una imagen

Ahora usando FWH 10.3 + Harbour 3.0 Rev: 16951 + BCC582 en Windows 8.1 pro 64 bits

Ayuda please!

Re: Ayuda con Objeto Stream de ADO

PostPosted: Wed Jul 08, 2015 9:56 am
by Antonio Linares
Marcelo,

Prueba a ejecutar esto antes:

MsgInfo( ::oStream:Read(-1) )
oRsfoto:fields('foto'):Value = ::oStream:Read(-1)

y comprueba si falla en esa primera línea ó en la segunda.

Lo que quiero saber es si el error viene de usar el -1 porque la documentación de Microsoft no lo menciona:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms676702(v=vs.85).aspx

ó se produce en la asignación, es decir al asignarle el valor al campo foto.

Re: Ayuda con Objeto Stream de ADO

PostPosted: Wed Jul 08, 2015 1:25 pm
by sjingo
Un saludo Antonio

El resultado de msginfo fue: "Array"
y el error se produce al realizar la asignación.

El argumento -1 corresponde a la constante adReadAll y es por default, yo lo coloqué por si acaso por lo que al final da igual si lo coloco o no. Está en esta página: http://www.w3schools.com/asp/met_stream_read.asp

Además si hago
Msginfo(::oStream:Size,"tamaño leido"), me da el valor correcto en bytes que se ha leído.

Re: Ayuda con Objeto Stream de ADO

PostPosted: Wed Jul 08, 2015 1:48 pm
by Antonio Linares
Marcelo,

Que tipo de valor espera oRsfoto:fields('foto'):Value ?

Re: Ayuda con Objeto Stream de ADO

PostPosted: Wed Jul 08, 2015 2:31 pm
by sjingo
Espera un tipo de dato binario. Es decir su campo en MySql es de tipo mediumblob. y el valor que devuelve
Code: Select all  Expand view
oRsfoto:fields('foto'):Type
Es 205

Re: Ayuda con Objeto Stream de ADO

PostPosted: Wed Jul 08, 2015 3:12 pm
by Antonio Linares
Marcelo,

Si pudieses construir la aplicación con las versiones antiguas y pudieses comprobar el tipo del valor ::oStream:Read(-1) en la versión antigua, asi podriamos ver que es
lo que ha cambiado en Harbour o tal vez eso no es lo que ha cambiado, pero vamos descartando posibilidades.

Re: Ayuda con Objeto Stream de ADO

PostPosted: Wed Jul 08, 2015 3:40 pm
by sjingo
Ouch!, ......me va a llevar tiempo, porque entre tantos formateos, respaldos, cambios de equipo etc. no recuerdo donde podría encontrarlos. Ahora mismo voy aponerme a la búsqueda.

Re: Ayuda con Objeto Stream de ADO

PostPosted: Wed Jul 08, 2015 8:50 pm
by sjingo
Antonio
He encontrado los fuentes originales que generan la aplicación donde todo funciona bien.
He vuelto a compilar y linkear con esos recursos antiguos y las fotos suben correctamente.
Como resultado del mensaje MsgInfo( ::oStream:Read() ) me da cuatro caracteres extraños : ӰØӰà y luego del mensaje sale error sin grabar en la tabla, pero si quito el mensaje todo graba bien.
Luego de comprobar que todo funciona bien he realizado varias pruebas compilando con las diversas versiones de FWH, Harbour y BCC, usando el mismo archivo rmk, cambiando la ruta de las carpetas .
Funciona bien únicamente con esta combinación: harbour 1.1.0 + fw904 + bcc55

Al cambiar harbour 1.1.0 por harbour 2.0 (rev 13372) da el siguiente error
c:\Borland\bcc55\bin\ilink32 -Gn -aa -Tpe -s @b32.bc
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: Unresolved external '_hb_vmProcessSymbolsEx' referenced from C:\FWH904\LIB\FIVEH.LIB|ERRSYSW

Ahora con: harbour 1.1.0 + fw904 + bcc582 (se ha cambiado bcc55 por bcc582) da los siguientes errores:

c:\Borland\bcc582\bin\ilink32 -Gn -aa -Tpe -s @b32.bc
Turbo Incremental Link 5.69 Copyright (c) 1997-2005 Borland
Error: Unresolved external '__rwstd::__rw_stdexcept_NoNamedException' referenced from C:\FWH904\LIB\FIVEHC.LIB|ANIGIF
Error: Unresolved external 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >::__nullref' referenced from C:\FWH904\LIB\FIVEHC.LIB|ANIGIF
Error: Unresolved external 'std::ios_base::failure::what() const' referenced from C:\FWH904\LIB\FIVEHC.LIB|ANIGIF
Error: Unresolved external 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >::__getRep(unsigned int, unsigned int)' referenced from C:\FWH
904\LIB\FIVEHC.LIB|ANIGIF
Error: Unresolved external '__rwstd::ref_counted::~ref_counted()' referenced from C:\FWH904\LIB\FIVEHC.LIB|ANIGIF


Para complicar más esto, he probado a cambiar FWH904 por FWH103, que es con la que quiero que funcione, porque tiene actualizaciones en el xbrowse que son importantes (no recuerdo que era).

A la combinación : Harbour 1.1.0 + fw103+bcc582 o Harbour 1.1.0 + fw103+bcc55 da los siguientes errores:

Error: Unresolved external '_hb_storvni' referenced from C:\FWH\LIB\FIVEHC.LIB|WNDIS
Error: Unresolved external '_hb_storvnl' referenced from C:\FWH\LIB\FIVEHC.LIB|WNDIS
Error: Unresolved external '_hb_storvc' referenced from C:\FWH\LIB\FIVEHC.LIB|WNDIS
Error: Unresolved external '_hb_parvnl' referenced from C:\FWH\LIB\FIVEHC.LIB|HARBOURC
Error: Unresolved external '_hb_parvclen' referenced from C:\FWH\LIB\FIVEHC.LIB|FONTS
Error: Unresolved external '_hb_parvc' referenced from C:\FWH\LIB\FIVEHC.LIB|FONTS
Error: Unresolved external '_hb_parvl' referenced from C:\FWH\LIB\FIVEHC.LIB|FONTS
Error: Unresolved external '_hb_parvni' referenced from C:\FWH\LIB\FIVEHC.LIB|FONTS
Error: Unresolved external '_hb_storvl' referenced from C:\FWH\LIB\FIVEHC.LIB|FONTS
Error: Unresolved external '_hb_storvclen' referenced from C:\FWH\LIB\FIVEHC.LIB|REGEDIT
Error: Unresolved external '_hb_storvnd' referenced from C:\FWH\LIB\FIVEHC.LIB|RICHEDIT
Error: Unresolved external '_HB_FUN_HB_TTOC' referenced from C:\FWH\LIB\FIVEH.LIB|VALBLANK


Finalmente para quedar completamente enredado, quisiera que funcione esta combinación: Harbour 3.2 + FWH10.3 + BCC582 y cuyos errores finales son:
Turbo Incremental Link 5.69 Copyright (c) 1997-2005 Borland
Error: Unresolved external '_HB_FUN_LOADLIBRARY' referenced from C:\FWH\LIB\FIVEH.LIB|HARBOUR
Error: Unresolved external '_HB_FUN_FREELIBRARY' referenced from C:\FWH\LIB\FIVEH.LIB|HARBOUR

Aún así superando estos errores, no sé si me suban las imágenes. Pues les recuerdo que actualmente uso Harbour 2.0 + FWH 10.3 + BCC582, que crea bien la aplicación PERO los objetos stream no cargan bien o no leen los archivos de imágenes.

Si no hay solución me tocará regresar a las versiones anteriores :( . Acaso sólo a mí me pasa esto?

Saludos

Re: Ayuda con Objeto Stream de ADO

PostPosted: Thu Jul 09, 2015 12:13 am
by sjingo
Como ya comenté en el otro post, el problema del LOADLIBRARY se ha superado usando la combinación: Harbour 3.2 + FWH10.3 + BCC582, pero siguen los errores al tratar de subir las imágenes. El mensaje de error que ahora presenta al ejecutar el siguiente codigo :
Code: Select all  Expand view

try
    oRsfoto:fields('foto'):Value = ::oStream:Read()
catch oError
    MsgInfo( "SEND01 NO : " + ";" + CRLF+ ;
    "Message: " + oError:Description )
end

dice "La operación en varios pasos generó errores. Compruebe los valores de estado (0x80040E21)", y no graba en la tabla.

y ahora al hacer msginfo(::oStream:Read()) ya no me da "array", me da el mismo mensaje que me dio en la forma que funciona es decir me da esto: "ӰØӰà". Pareciera que nos vamos acercando.
Espero comentarios. Gracias

Re: Ayuda con Objeto Stream de ADO

PostPosted: Thu Jul 09, 2015 5:33 pm
by sjingo
Antonio

Sigo intentando solucionar esto, pero ya se me acabaron las ideas. Existe este problema en las versiones nuevas de FWH?, o donde está el problema?
Si hasta hoy esto no encuentro solución, volveré a las versiones anteriores donde sí funciona :? . Pues he perdido demasiado tiempo en esto.

Re: Ayuda con Objeto Stream de ADO

PostPosted: Thu Jul 09, 2015 8:06 pm
by Antonio Linares
Marcelo,

Puedes enviarme un PRG que yo construya aqui y te envio el EXE y comprobamos si te funciona
con la versión más reciente ?

Re: Ayuda con Objeto Stream de ADO

PostPosted: Thu Jul 09, 2015 8:22 pm
by sjingo
Antonio

Algún correo en específico?

Gracias

Re: Ayuda con Objeto Stream de ADO

PostPosted: Thu Jul 09, 2015 8:37 pm
by Antonio Linares

Re: Ayuda con Objeto Stream de ADO

PostPosted: Thu Jul 09, 2015 10:05 pm
by sjingo
Por si le interesa probar a alguien, dejo el código que cree como ejemplo, que funciona con mi antigua versión de FWH904. Recoge una foto de archivo y lo graba en un campo MEDIUMBLOB de Mysql, usando ADO. No hay que adicionar nada, solo el archivo ado.ch, que lo tiene cualquier versión de FWH. Y por supuesto que tienen que tener creada la Base de datos y la tabla respectiva.
Code: Select all  Expand view

#include "FiveWin.ch"
#include "ado.ch"

function Main()
    local cServer, cDataBase, cUser, cPassWord, nPort,cDriveName,cDB
    local oCon,oError
    cServer         :="localhost             "//
    cDataBase   := "tuBase              " // Datos con los que se va a trabajar
    cUser       := "tuUsuario              "
    cPassWord   := "tuClave        "
    nPort       := 3306
    cDriveName  := "MySQL ODBC 5.1 DRIVER"
    cDB:="mysql"   //BDatos para la conexión inicial


    //Crear el objeto conexión
    //--------------------------------------------------
    TRY
        oCon := TOleAuto():new("adodb.connection")
    CATCH oError
        MsgStop( "No se pudo crear el objeto conexión !")
        RETURN(.F.)
    END
    oCon:CursorLocation=adUseClient


    //Abrir la conexión usando el objeto connection creado
    //----------------------------------------------------
    oCon:ConnectionString :="Driver={"+alltrim(cDriveName)+"};Server=" + ALLTRIM(cServer) + ;
    ";Port=3306;Database=" + ALLTRIM(cDataBase) + ;
    ";User=" + ALLTRIM(cUser)+;
    "; Password=" + ALLTRIM(cPassWord) + ";Option=3;"

    TRY
        oCon:Open()
    CATCH oError
        MsgInfo("Falló el intento de conexión con la cuenta "+cUser+" , REVISE LA CONEXION DE SU RED O LA CONEXION A INTERNET !")
        RETURN(.F.)
    END

    NewFoto(oCon,"C:\camisetas\adidas_n.jpg")
   
return nil


FUNCTION NewFoto(oCon,cBMpFile,idVeh,fecha,nota)
    local cfile:=cBmpFile
    local oError
    local oRsFoto,ostrp, oStream

    SET DATE FORMAT TO "yyyy-mm-dd"
    default fecha:=dtoc(date())
    default nota:=" "
    default idVeh:=1


    //Recordset para la foto grande
    TRY
        oRsFoto := TOleAuto():New("ADODB.recordset")
    CATCH oError
        MsgStop( "No se pudo crear el recordset para la Foto !")
        RETURN .f.
    END

    //Configuramos el recordset que me dovolvera un registro para la foto
    oRsFoto:CursorLocation := adUseClient
    oRsFoto:LockType := adLockOptimistic
    oRsFoto:CursorType := adOpenKeyset//adOpenDynamic
    oRsFoto:Source := "SELECT cod,cod_veh,foto_p,foto,tipo,fecha,nota FROM fotos_veh where cod = 0 "
    //oRsFoto:ActiveConnection(oCon)
    TRY
        oRsFoto:Open(oRsFoto:Source, oCon)//, adOpenStatic, adLockOptimistic)
    CATCH oError
        MsgStop( "No se pudo abrir la Tabla de la Foto!")
        RETURN .f.
    END

    //----Objeto stream para la foto grande
    TRY
        oStream := TOleAuto():New("adodb.stream")
    CATCH oError
        MsgStop( "No se pudo crear el Stream para leer la Foto !")
    END

    oStream:Type := adTypeBinary

    TRY
        oStream:Open()
        oStream:LoadFromFile(alltrim(cfile))    
    catch oError
        MsgStop("Problemas al leer la fotografía desde el archivo")
        oStream:Close()
        return .f.
    end

    oRsFoto:Addnew()
    oRsFoto:fields('cod_veh'):Value := idVeh
    oRsFoto:Fields('fecha'):Value := fecha
    oRsFoto:Fields('nota'):Value := nota

    try
        oRsfoto:fields('foto'):Value = oStream:Read()
    catch oError
        MsgStop("Problemas al colocar la fotografía en su respectivo campo"+ CRLF+ ;
        "Message: " + oError:Description)
    end

    oRsFoto:Update()
    oStream:Close()
    oRsFoto:Close()
    msgalert("Foto Guardada en la Base de Datos")

return nil

Re: Ayuda con Objeto Stream de ADO

PostPosted: Thu Jul 09, 2015 10:50 pm
by Armando
Marcelo:

He probado tu código y me da el mensaje "Foto Guardada en la Base de Datos",
ahora no se cómo leerla para ver si está bien grabada, si quieres mostrarme el código
para leerla y confirmar que está bien grabada.

Uso, FWH0810, xHarbour build 1.1.0 Intl. (SimpLex) (Rev. 6195) y BCC 5.5

Saludos