Ayuda con Objeto Stream de ADO (Solucionado)

Ayuda con Objeto Stream de ADO (Solucionado)

Postby sjingo » Wed Jul 08, 2015 4:09 am

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  RUN


//::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!
Last edited by sjingo on Sun Jul 12, 2015 12:16 am, edited 1 time in total.
Marcelo Jingo
User avatar
sjingo
 
Posts: 229
Joined: Sat Mar 18, 2006 3:42 pm
Location: Ibarra-Ecuador

Re: Ayuda con Objeto Stream de ADO

Postby Antonio Linares » Wed Jul 08, 2015 9:56 am

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.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Ayuda con Objeto Stream de ADO

Postby sjingo » Wed Jul 08, 2015 1:25 pm

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.
Marcelo Jingo
User avatar
sjingo
 
Posts: 229
Joined: Sat Mar 18, 2006 3:42 pm
Location: Ibarra-Ecuador

Re: Ayuda con Objeto Stream de ADO

Postby Antonio Linares » Wed Jul 08, 2015 1:48 pm

Marcelo,

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

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Ayuda con Objeto Stream de ADO

Postby sjingo » Wed Jul 08, 2015 2:31 pm

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  RUN
oRsfoto:fields('foto'):Type
Es 205
Marcelo Jingo
User avatar
sjingo
 
Posts: 229
Joined: Sat Mar 18, 2006 3:42 pm
Location: Ibarra-Ecuador

Re: Ayuda con Objeto Stream de ADO

Postby Antonio Linares » Wed Jul 08, 2015 3:12 pm

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.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Ayuda con Objeto Stream de ADO

Postby sjingo » Wed Jul 08, 2015 3:40 pm

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.
Marcelo Jingo
User avatar
sjingo
 
Posts: 229
Joined: Sat Mar 18, 2006 3:42 pm
Location: Ibarra-Ecuador

Re: Ayuda con Objeto Stream de ADO

Postby sjingo » Wed Jul 08, 2015 8:50 pm

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
Marcelo Jingo
User avatar
sjingo
 
Posts: 229
Joined: Sat Mar 18, 2006 3:42 pm
Location: Ibarra-Ecuador

Re: Ayuda con Objeto Stream de ADO

Postby sjingo » Thu Jul 09, 2015 12:13 am

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  RUN

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
Marcelo Jingo
User avatar
sjingo
 
Posts: 229
Joined: Sat Mar 18, 2006 3:42 pm
Location: Ibarra-Ecuador

Re: Ayuda con Objeto Stream de ADO

Postby sjingo » Thu Jul 09, 2015 5:33 pm

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.
Marcelo Jingo
User avatar
sjingo
 
Posts: 229
Joined: Sat Mar 18, 2006 3:42 pm
Location: Ibarra-Ecuador

Re: Ayuda con Objeto Stream de ADO

Postby Antonio Linares » Thu Jul 09, 2015 8:06 pm

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 ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Ayuda con Objeto Stream de ADO

Postby sjingo » Thu Jul 09, 2015 8:22 pm

Antonio

Algún correo en específico?

Gracias
Marcelo Jingo
User avatar
sjingo
 
Posts: 229
Joined: Sat Mar 18, 2006 3:42 pm
Location: Ibarra-Ecuador

Re: Ayuda con Objeto Stream de ADO

Postby Antonio Linares » Thu Jul 09, 2015 8:37 pm

regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Ayuda con Objeto Stream de ADO

Postby sjingo » Thu Jul 09, 2015 10:05 pm

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  RUN

#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
Marcelo Jingo
User avatar
sjingo
 
Posts: 229
Joined: Sat Mar 18, 2006 3:42 pm
Location: Ibarra-Ecuador

Re: Ayuda con Objeto Stream de ADO

Postby Armando » Thu Jul 09, 2015 10:50 pm

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
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
Armando
 
Posts: 3242
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 36 guests

cron