Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-01-2014
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Question Problema con procedimiento almacenado y Delphi

Buenas, tengo la siguiente llamada a procedimiento almacenado en Delphi:
Código Delphi [-]
function recupero_Valor_Entorno_EBD(nombre_Entorno:string):TStream;
var
  //resultado:TBlobField;
  stream:TStream;
begin
  with DataModule1.spValorEntornoEBD do
  begin
    Close;
    Params.Clear;
    StoredProcName:='RECUPERO_VALOR_ENTORNO_EBD ';  //nombre del store procedure
    Params.CreateParam(ftWideString, 'NOMBRE_ENTORNO', ptInput); //creamos el parametro de entrada
    Params.CreateParam(ftBlob, 'VALOR', ptOutput);   //Valor que recibimos
    ParamByName('NOMBRE_ENTORNO').AsString:=nombre_entorno ;  //le asignamos al param. entrada, su valor
    Prepare; //hacemos que se "arme" el objeto SP
    try
      ExecProc;
      stream:=TStringStream.Create(ParamByName('VALOR').AsString);
      //stream:=StringToStream(ParamByName('VALOR').AsBlob);
      unPrepare;
      Result:=stream;
      //stream.Free;
    except
      UnPrepare;
      //stream.Free;
      raise;
    end; //del try
  end;
end;

Como se ve, recupera desde una tabla de Firebird un valor, que es un BLOB.
El problema es que cuando lo quiero ver en un RichEdit me muestra simplemente "(blob)", y no el contenido del blob.

Pongo el procedimiento almacenado que hice:
Código SQL [-]
CREATE PROCEDURE RECUPERO_VALOR_ENTORNO_EBD (
    nombre_entorno varchar(30))
returns (
    valor blob sub_type 0 segment size 100)
as
begin
  /* Recupero el valor entorno según el nombre_entorno solicitado */
  Select CAST(e.valor_ebd AS BLOB) AS valor_ebd
  From entorno_boletin_digital e
  Where e.nombre_ebd = :nombre_entorno
  into :valor;
  suspend;
end;

Ahora, como lo intento poner en un RichEdit:
Código Delphi [-]
rchGobernador.Lines.LoadFromStream(recupero_Valor_Entorno_EBD('GOBERNADOR'));

Muestro la tabla:
Código SQL [-]
CREATE TABLE ENTORNO_BOLETIN_DIGITAL (
    COD_EBD          INTEGER NOT NULL,
    TIPO_EBD         VARCHAR(10),
    NOMBRE_EBD       VARCHAR(200),
    VALOR_EBD        BLOB SUB_TYPE 0 SEGMENT SIZE 100 CHARACTER SET ISO8859_1,
    DESCRIPCION_EBD  VARCHAR(300)

Agradecería que me dijeran que está pasando porque no le veo la razón para que haga eso.

Saludos.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
  #2  
Antiguo 17-01-2014
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.293
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Creo que el problema puede estar aquí:

Código Delphi [-]
stream:=TStringStream.Create(ParamByName('VALOR').AsString);

Estás recuperando un BLOB como string. No te da error, pero tiene pinta de que no tiene mucha lógica, dato que un BLOB puede tener cosas que no tengan nada que ver con un String.

A ver si este link te sirve.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 17-01-2014
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Question

Trabajando un poco con el enlace que me diste, hice lo siguiente:
Código Delphi [-]
function recupero_Valor_Entorno_EBD(nombre_Entorno:string):TStream; 
var   
//resultado:TBlobField;   
stream:TMemoryStream; 
begin
   with DataModule1.spValorEntornoEBD do
   begin
     Close;
     Params.Clear;
     StoredProcName:='RECUPERO_VALOR_ENTORNO_EBD ';  //nombre del store procedure
     Params.CreateParam(ftWideString, 'NOMBRE_ENTORNO', ptInput); //creamos el parametro de entrada
     Params.CreateParam(ftBlob, 'VALOR', ptOutput);   //Valor que recibimos
     ParamByName('NOMBRE_ENTORNO').AsString:=nombre_entorno ;  //le asignamos al param. entrada, su valor
     Prepare; //hacemos que se "arme" el objeto SP
     try
       ExecProc;
       stream:=TMemoryStream.Create;
    //Aquí hice el reemplazo de líneas de código.
      //stream:=StringToStream(ParamByName('VALOR').AsBlob);
      TBlobField(FieldByName('valor')).SaveToSream(stream);
      unPrepare;
       Result:=stream;
       //stream.Free;
     except
       UnPrepare;
       //stream.Free;
       raise;
     end; //del try
   end;
 end;

Al ejecutar, me sale el siguiente cartel:
"Imposible recuperar datos...
Mensaje: spValorEntornoEBD: Field 'valor' not found"

El error ocurre cuando lee la línea:
Código Delphi [-]
TBlobField(FieldByName('valor')).SaveToSream(stream);

Santiago.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.

Última edición por santiago14 fecha: 17-01-2014 a las 20:07:05. Razón: Ahora quedó mejor.
Responder Con Cita
  #4  
Antiguo 18-01-2014
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.293
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Código Delphi [-]
...
Select CAST(e.valor_ebd AS BLOB) AS valor_ebd
...

A lo mejor hay que usar valor_ebd
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 18-01-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Hasta donde tengo entendido, Firebird no soporta el pasaje de campos tipo BLOB o ARRAY en los procedimientos almacenados.

¿ No te sirve usar un TIBQuery o TIBDataSet ?, por ejemplo:
Código Delphi [-]
procedure GetBlobField(Qry: TIBQuery; RE: TRichEdit; const aID: Integer);
var
  Stream: TStream;
begin
  Qry.Close;
  Qry.SQL.Text := 'SELECT CAMPO_BLOB FROM TABLA WHERE ID = :P_ID';
  Qry.ParamByName('P_ID').AsInteger := aID;
  Qry.Open;
  Stream := TMemoryStream.Create;
  try
    TBlobField(Qry.FieldByName('CAMPO_BLOB')).SaveToStream(Stream);
    Stream.Seek(0, soFromBeginning);
    RE.PlainText:= False;
    RE.Lines.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 18-01-2014
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Thumbs up

Cita:
Empezado por ecfisa Ver Mensaje
Hola.

Hasta donde tengo entendido, Firebird no soporta el pasaje de campos tipo BLOB o ARRAY en los procedimientos almacenados.
Ahora sí, con esto queda claro.

Por supuesto que me sirve hacerlo con una consulta, de hecho, voy a seguir el ejemplo que enviaste. La verdad es que no sabía que Firebird no soportaba esta funcionalidad, espero que en versiones posteriores lo implementen.

Gracias.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problema con Procedimiento almacenado Tauro78 Firebird e Interbase 6 12-02-2007 17:43:06
Problema con procedimiento almacenado XBart Firebird e Interbase 3 27-10-2005 09:08:17
problema con procedimiento almacenado Choclito Firebird e Interbase 2 04-11-2004 20:58:46
Problema con procedimiento almacenado juziel Firebird e Interbase 4 20-09-2004 18:31:41
Problema con un procedimiento almacenado Markoz Firebird e Interbase 1 08-07-2003 11:47:20


La franja horaria es GMT +2. Ahora son las 15:21:06.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi