Con las versiones que tu usas, si funciona. El problema es con versiones superiores por ejemplo con la que prob茅: FWH10.3 + Harbour 3.2 + BCC582 ya no me ha funcionado.
Para ver los datos puedes usar NAVICAT 8 para mysql. Al abrir la tabla puedes dar click en el bot贸n "Image" de la barra de herramientas y podr谩s ver en la parte inferior el contenido del campo BLOB
Pero si en verdad quieres el c贸digo para leer, el proceso m谩s o menos es el siguiente:
1. Se lee el contenido de la Tabla en un objeto stream
2. Con el contenido binario lo podemos pasar a una variable o un objeto TIMAGE
3. Yo lo que hago es lo contrario a la subida. Con el contenido ya puesto en el objeto Stream lo guardo en el disco y luego lo leo para colocarlo en un control IMAGE.
Te adjunto el c贸digo que lee la imagen, no he borrado nada. Hay c贸digo que ya ni me acuerdo para qu茅 sirve. As铆 que si lo puedes minimizar que mejor.
La idea con este c贸digo es que cada imagen que se recupera de la base de datos lo guardo en una carpeta temporal en disco, son fotos de un veh铆culo. Por cada veh铆culo se crea una carpeta en funci贸n de su id y se graban las fotos all铆, luego estas fotos de disco son mostradas en un objeto IMAGE.
//--------------------------------------------------------------
//cnombre : Nombre de la foto
METHOD LeerFoto(cnombre,oImg) CLASS TVehic
local nBookMark:=0
local sumatot:=0,cnom,ncod:="0"
local oRsFoto,Stream , ofoto,cFold,cfoto
//oRsV es el recordset que ya esta abierto y guarda toda la tabla
if !::oRsV:EOF .and. !::oRsV:BOF
聽 聽 cFold:="V"+alltrim(str(::oRsV:Fields('cod_veh'):Value))
else
聽 聽 return nil
endif
//Recuperamos del nombre pasado el codigo de la foto
cnom:=cfileNoExt(cnombre)
ncod:=substr(cnom,at("f",cnom)+1)
//Recordset para la foto grande
TRY
聽 聽 oRsFoto := TOleAuto():New("adodb.recordset")
CATCH oError
聽 聽 MsgStop( "No se pudo crear el recordset para la Foto !", CAR_VERSION)
聽 聽 RETURN .f.
END
//Configuramos el recordset que me dovolvera una foto
oRsFoto:CursorLocation := adUseClient
oRsFoto:LockType := adLockOptimistic
oRsFoto:CursorType := adOpenKeyset//adOpenDynamic
oRsFoto:Source := "SELECT cod,foto,tipo FROM fotos_veh where cod ="+ nCod
****oRsFoto:ActiveConnection(oCon)
TRY
聽 聽 oRsFoto:Open(oRsFoto:Source,oCon)
CATCH oError
聽 聽 MsgStop( "No se pudo abrir la Tabla de la Foto!", car_version)
聽 聽 ShowError(oError,oCon)
聽 聽 RETURN .f.
END
TRY
聽 聽 ::oStream := TOleAuto():New("adodb.Stream")
CATCH oError
聽 聽 MsgStop( "No se pudo crear el Stream para leer la Foto !", CAR_VERSION)
END
// Especifica el tipo de datos ( binario ) 聽
::oStream:Type := adTypeBinary
TRY
聽 聽 ::oStream:Open()
CATCH oError
聽 聽 MsgStop( "No se pudo establecer la conexion stream!", car_version)
聽 聽 ShowError(oError,oCon)
聽 聽 return .f.
END
if !lisDir("imgtmp")
聽 聽 lMkDir("imgtmp")
endif
if !lisDir("imgtmp\" + cFold )
聽 聽 聽lMkDir("imgtmp\" + cFold )
endif
if !oRsFoto:EOF .and. !oRsFoto:BOF
聽 聽 //Graba los datos en el objeto stream 聽
聽 聽 IF oRsFoto:Fields('foto'):Value !=nil
聽 聽 聽 聽 ::Write(oRsFoto:Fields('foto'):Value)
聽 聽 聽 聽 cfoto:="imgtmp\" + cFold+"fg"+alltrim(str(oRsFoto:Fields('cod'):Value)) + "." + alltrim(oRsFoto:Fields('tipo'):Value)
聽 聽 聽 聽 if file(cfoto)
聽 聽 聽 聽 聽 聽 ferase(cfoto)
聽 聽 聽 聽 endif
聽 聽 聽 聽 //Se graba un 聽archivo temporal 聽en disco
聽 聽 聽 聽 ::SaveToFile(cfoto, adSaveCreateOverWrite) 聽
聽 聽 聽 聽 if fsize(cfoto)>0 聽//aqui se debe cargar una imagen si no hay la precisa
聽 聽 聽 聽 聽 聽 oImg:LoadBmp(cfoto)
聽 聽 聽 聽 else
聽 聽 聽 聽 聽 聽 oImg:LoadImage( "shade" )
聽 聽 聽 聽 endif
聽 聽 聽 聽 oimg:Refresh()
聽 聽 endif
endif
::Close()
oRsfoto:Close()
return .t.Saludos