RE:Problema con selectblob
Hola:
Saben tengo un problema similar, cuando voy grabar un archivo pdf en la base de datos, no envia ningun error pero cuando lo quiero recuperar no lo recupera, esto sucede siempre y cuando el largo de la variable BLOB en donde se encuentra el archivo pdf es mayor a 65530, de lo contrario funciona sin ningun problema. A continuacion dejare el codigo con el cual genero el archivo pdf, con el que guardo en la base de datos y con el que recupera la imagen de la base de datos.
Datos a tener en cuenta: power builder 11.1, Sql server 2000, tipo dato del campo donde guardo el archivo es IMAGE.
/****************************************************************************************/
Codigo con el cual genero el archivo pdf y lo deja en el directorio C:\, esto lo realiza sin ningun problema siempre:
//Metodo Distiller
Int li_resp
String Nombre_Fichero
dw_preliminar2.Object.DataWindow.Export.PDF.Method = Distill!
dw_preliminar2.Object.DataWindow.Printer = "PDF995"
dw_preliminar2.Object.DataWindow.Export.PDF.Distill.CustomPostScript="Yes"
nombre_fichero = "C:\documento.pdf"
li_resp=dw_preliminar2.SaveAs(nombre_fichero, PDF!, true)
/****************************************************************************************/
Codigo con el cual grabo en la base de datos:
blob lbl_data, lbl_temp,bb_nulo
long ll_file
ll_file = FileOpen("c:\documento.pdf",streammode!)
Do While FileRead(ll_file,lbl_temp) > 0
lbl_data += lbl_temp
Loop
FileClose(ll_file)
bb_nulo = Blob('0x424DDAC9000000000000360000002800000076000000910000000100180000000000A4C90000CE0E0000D80E00000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF')
SQLCA.AutoCommit = false
delete from medios.dbo.IMAGEN_PORTAFOLIO_VIRTUAL
where por_correlativo = :ii_por
using sqlca;
if SQLCA.SQLCode <>0 then
MessageBox("Atención",'Error al Eliminar Documento Convenio Honorario~r'+SQLCA.SQLErrText,Information!)
rollback using sqlca;
sqlca.autocommit = TRUE
return
end if
select isnull(max(id_tabla),0)+1 into :si_ipo
from TABLA_IMAGEN (nolock);
INSERT INTO TABLA_IMAGEN(id_tabla,imagen)
VALUES ( :si_ipo, bb_nulo ) Using Sqlca;
If Sqlca.Sqlcode <> 0 then
Messagebox("Error de la Base de Datos", "Se ha Producido un Error al Insertar. "+ sqlca.SQLErrText , StopSign!)
Rollback Using sqlca;
sqlca.autocommit = TRUE
Return
End If
UPDATEBLOB TABLA_IMAGEN
SET imagen = :lbl_data
where id_tabla = :si_ipo
using sqlca;
if SQLCA.SQLCode <>0 then
MessageBox("SQL error",SQLCA.SQLErrText,Information!)
Rollback Using sqlca;
sqlca.autocommit = TRUE
Return
end if
FileDelete("c:\documento.pdf")
Commit using sqlca;
sqlca.autocommit = TRUE
/****************************************************************************************/
Codigo con el cual recupero la imagen de la base de datos y la dejo en C:\:
blob lbl_data
blob lbl_temp
long ll_file, ll_long = 0, ll_tam
integer li_pos = 1, si_ipo
select max(id_tabla) into :si_ipo
FROM TABLA_IMAGEN ;
if si_ipo = 0 then
messagebox('Atención','No existe Documento registrado para esta plantilla')
return
end if
SELECTBLOB imagen INTO :lbl_data
FROM TABLA_IMAGEN
where id_tabla= :si_ipo;
is_file = "c:\pdf1.pdf"
ll_file = FileOpen(is_file,StreamMode!,Write!)
ll_tam = len(lbl_data)
if ll_tam <= 32766 then
FileWrite(ll_file,lbl_data)
else
Do
lbl_temp = BlobMid(lbl_data,li_pos,32765)
ll_long = ll_long + FileWrite(ll_file,lbl_temp)
li_pos = li_pos + 32765
Loop While ll_long <= ll_tam
end if
FileClose(ll_file)
/****************************************************************************************/
Ojala alguien me pueda ayudar, ya que e buscar por todas partes y no e encontrado nada.
Saludos y Gracias