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.
- Code: Select all Expand view RUN
//--------------------------------------------------------------
//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
::oStream: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
::oStream: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
::oStream:Close()
oRsfoto:Close()
return .t.
Saludos