Ir al contenido



Foto

Como agregar un campo blob por medio de un query???


  • Por favor identifícate para responder
7 respuestas en este tema

#1 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 680 mensajes
  • LocationMéxico D.F.

Escrito 13 noviembre 2009 - 12:25

Que tal amigos, tengo un problema, necesito insertar un registro que contiene campos blob (binarios) a una base de access, pero esto por medio de un query es decir



sql
  1. INSERT INTO tabla (campo1,campo2) VALUES (1,?)



alguien que me pueda ayudar con esto?

saludos y de antemano gracias por su apoyo.
  • 0

#2 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.937 mensajes
  • LocationMéxico

Escrito 13 noviembre 2009 - 12:30

Que tal amigos, tengo un problema, necesito insertar un registro que contiene campos blob (binarios) a una base de access, pero esto por medio de un query es decir



sql
  1. INSERT INTO tabla (campo1,campo2) VALUES (1,?)



alguien que me pueda ayudar con esto?

saludos y de antemano gracias por su apoyo.


Claro amigo solo una pregunta, que conector usas?
  • 0

#3 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.133 mensajes

Escrito 13 noviembre 2009 - 01:02

Coincidencialmente estaba lidiando ayer con algo similar, ya que no me tomaba el valor del campo Blob como lo hace con los otros campos,  finalmente lo resolví pasando el valor del parámetro del Campo Blob mediante un TStream.

El siguiente ejemplo muestra el paso de parámetros desde un TClientDatset (lado cliente) de nombre cl a un TSQlServerMethod de nombre (saa) en el que el campo NOTAS es de tipo Blob.



delphi
  1. procedure TForm1.Button4Click(Sender: TObject);
  2. var
  3. st:Tstream;
  4. begin
  5. st := TMemoryStream.Create;
  6. clNotas.SaveToStream(st);
  7.   with saa do
  8.   begin
  9.     Params[0].Value := clID_AFILIADO.Value;
  10.     Params[1].Value := clDOCUMENTO.Value;
  11.     Params[2].Value := clNOMBRE.Value;
  12.     Params[3].Value := clAPELLIDOS.Value;
  13.     Params[4].Value := clTELEFONOS.Value;
  14.   Params[5].LoadFromStream(st,ftBlob);
  15.     ExecuteMethod
  16.   end;
  17. st.free
  18. end;



Edito: No leí bien y tu problema es en access, el ejemplo que doy es en Firebird con dbExpress, pero depronto te sirve de algo.

Y por favor a los maestros del foro, a pesar de que el código del ejemplo me funciona correctamente, por favor me digan si es correcto lo que estoy haciendo con el TStream.

Gracias
  • 0

#4 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 680 mensajes
  • LocationMéxico D.F.

Escrito 13 noviembre 2009 - 11:03

Claro amigo solo una pregunta, que conector usas?


Poli, uso los ADO desde delphi pero el problema es que la base de datos en acces, esta en un servidor web y acceso a él por medio de un webservices, en el cual solo me dajaron disponible un metodo para pasar un query (INSERT. UPDATE ) y este WS ejecuta el query para es base de datos.

Por eso mi pregunta de enviar un blob en una sentencia SQL.

gracias.

en cuanto a lo que comentas Wilson yo lo hago de la siguiente manera


delphi
  1. qryTmp := TzQuery.Create(nil);
  2.   with qryTmp do begin
  3.     try
  4.       Connection:= FBDatos;
  5.       SQL.Clear;
  6.  
  7.       SQL.Add('update tabla set');
  8.       SQL.Add('campoblob= :ValBlob,');
  9.       SQL.Add('where');
  10.       SQL.Add('(clave='+BCliente+')');
  11.       Params[0].DataType := ftBlob;
  12.       Params[0].LoadFromStream(KeyEnCrip,ftBLOB);
  13.       try
  14.         ExecSQL;
  15.       except
  16.         raise exception.create('Los datos Critográficos no se almacenaron');
  17.       end;
  18.     finally
  19.       free;
  20.     end;
  21.   end;



El problema como le comento a Poli es que necesito ejecutar una sentencia SQL donde se vayan los archivos blob.

gracias y saludos


  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.210 mensajes
  • LocationRepública Dominicana

Escrito 14 noviembre 2009 - 06:12

Tengo entendido que los ADO no manejan muy bien los datos BLOB, si me equivoco, que me corrijan.

Saludos.
  • 0

#6 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.937 mensajes
  • LocationMéxico

Escrito 14 noviembre 2009 - 09:23

Tengo entendido que los ADO no manejan muy bien los datos BLOB, si me equivoco, que me corrijan.

Saludos.


Pues, en los años que llevo trabajando con ADO nunca he tenido problemas con tipos de dato blob. Tanto como campo de una tabla o parámetro de un procedimiento almacenado me ha funcionado muy bien.

Saludos.
  • 0

#7 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.133 mensajes

Escrito 14 noviembre 2009 - 02:01

El siguiente ejemplo  actualiza un tabla de Access con dos campos:  ID de tipo Integer y NOTAS de tipo BLOB (Memo en Access).

Utiliza un TADOConnection, un TADOTable, un TDBEdit y un TDBMemo para visualizar los resultados, el Stream se llena a partir del texto del DBMemo asignado al campo NOTAS, igual podrías utilizar como fuente un archivo.

Funciona correctamente.



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   Stream: TStream;
  4.   Query: TADOQuery;
  5. begin
  6.   Stream := TMemoryStream.Create;
  7.   (ADOTable1.FieldByName('NOTAS') as TBlobField).SaveToStream(Stream);
  8.   Query := TADOQuery.Create(self);
  9.   try
  10.     with Query do
  11.     begin
  12.       Connection := ADOConnection1;
  13.       Sql.Add('UPDATE TABLA SET NOTAS = :CAMPOBLOB WHERE ID = 1');
  14.       Parameters.ParamByName('CAMPOBLOB').LoadFromStream(Stream, ftBLOB);
  15.       ExecSQL
  16.     end;
  17.   finally
  18.     Stream.Free;
  19.     Query.Free;
  20.   end;
  21. end;


  • 0

#8 santiago14

santiago14

    Advanced Member

  • Miembros
  • PipPipPip
  • 288 mensajes
  • LocationCerrillos - Salta - Argentina

Escrito 13 junio 2013 - 07:20

Coincidencialmente estaba lidiando ayer con algo similar, ya que no me tomaba el valor del campo Blob como lo hace con los otros campos,  finalmente lo resolví pasando el valor del parámetro del Campo Blob mediante un TStream.
El siguiente ejemplo muestra el paso de parámetros desde un TClientDatset (lado cliente) de nombre cl a un TSQlServerMethod de nombre (saa) en el que el campo NOTAS es de tipo Blob.


delphi
  1. procedure TForm1.Button4Click(Sender: TObject);
  2. var
  3. st:Tstream;
  4. begin
  5. st := TMemoryStream.Create;
  6. clNotas.SaveToStream(st);
  7.   with saa do
  8.   begin
  9.     Params[0].Value := clID_AFILIADO.Value;
  10.     Params[1].Value := clDOCUMENTO.Value;
  11.     Params[2].Value := clNOMBRE.Value;
  12.     Params[3].Value := clAPELLIDOS.Value;
  13.     Params[4].Value := clTELEFONOS.Value;
  14.     Params[5].LoadFromStream(st,ftBlob);
  15.     ExecuteMethod
  16.   end;
  17. st.free
  18. end;



Esto funciona perfectos, si bien no es para la misma BD ni con los mismos componentes, la idea sigue vigente.
Gracias de nuevo.
Santiago
  • 0