FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Ayuda con Objeto Stream de ADO (Solucionado)
Posts: 229
Joined: Sat Mar 18, 2006 03:42 PM
Ayuda con Objeto Stream de ADO (Solucionado)
Posted: Wed Jul 08, 2015 04: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 (fw): Select all Collapse
//::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 = ::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 ::LoadFromFile(cfile) , no est谩 cargando adecuadamente el fichero, por lo que al ser pasado en oRsfoto:fields('foto'):Value = ::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!
Marcelo Jingo
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Ayuda con Objeto Stream de ADO
Posted: Wed Jul 08, 2015 09:56 AM
Marcelo,

Prueba a ejecutar esto antes:

MsgInfo( ::Read(-1) )
oRsfoto:fields('foto'):Value = ::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
Posts: 229
Joined: Sat Mar 18, 2006 03:42 PM
Re: Ayuda con Objeto Stream de ADO
Posted: Wed Jul 08, 2015 01: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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Ayuda con Objeto Stream de ADO
Posted: Wed Jul 08, 2015 01:48 PM

Marcelo,

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

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 229
Joined: Sat Mar 18, 2006 03:42 PM
Re: Ayuda con Objeto Stream de ADO
Posted: Wed Jul 08, 2015 02:31 PM
Espera un tipo de dato binario. Es decir su campo en MySql es de tipo mediumblob. y el valor que devuelve
Code (fw): Select all Collapse
oRsfoto:fields('foto'):Type
Es 205
Marcelo Jingo
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Ayuda con Objeto Stream de ADO
Posted: Wed Jul 08, 2015 03: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
Posts: 229
Joined: Sat Mar 18, 2006 03:42 PM
Re: Ayuda con Objeto Stream de ADO
Posted: Wed Jul 08, 2015 03: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
Posts: 229
Joined: Sat Mar 18, 2006 03:42 PM
Re: Ayuda con Objeto Stream de ADO
Posted: Wed Jul 08, 2015 08: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
Posts: 229
Joined: Sat Mar 18, 2006 03:42 PM
Re: Ayuda con Objeto Stream de ADO
Posted: 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 (fw): Select all Collapse
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(::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
Posts: 229
Joined: Sat Mar 18, 2006 03:42 PM
Re: Ayuda con Objeto Stream de ADO
Posted: Thu Jul 09, 2015 05: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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Ayuda con Objeto Stream de ADO
Posted: Thu Jul 09, 2015 08: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
Posts: 229
Joined: Sat Mar 18, 2006 03:42 PM
Re: Ayuda con Objeto Stream de ADO
Posted: Thu Jul 09, 2015 08:22 PM

Antonio

Alg煤n correo en espec铆fico?

Gracias

Marcelo Jingo
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Ayuda con Objeto Stream de ADO
Posted: Thu Jul 09, 2015 08:37 PM
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 229
Joined: Sat Mar 18, 2006 03:42 PM
Re: Ayuda con Objeto Stream de ADO
Posted: 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 (fw): Select all Collapse
#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
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: Ayuda con Objeto Stream de ADO
Posted: 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