Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Recupearr / Grabar Imagenes en SQL Server. (https://www.clubdelphi.com/foros/showthread.php?t=62054)

_Willa 02-12-2008 17:20:17

Recupearr / Grabar Imagenes en SQL Server.
 
Hola,

Estoy intentando recuperar una imagen guardada en un campo tipo "image" en Sql Server, no se si el tipo de campo es el correcto o usar el tipo
varbinary(MAX).

Despues de varios intentos, creo que esto funciona.
Código:

        Mi_Imagen->Picture->Graphic->SaveToStream(msImagen);
        unsigned int  sizeg=msImagen->Size;
TMemoryStream *msImagen = new TMemoryStream;
        TADOStoredProc *comm = NULL;
        comm = ptSQLBasic->DefineStoredProc("sp_INSERT_Grafico");
                TParameter *pe=comm->Parameters->CreateParameter("@Grafico",ftBlob,pdInput,0,"");
        pe->Parameters->ParamByName("@Grafico")->LoadFromStream(msImagen,ftBlob);
                        comm->ExecProc();

El procedimiento almacenado llamado es "sp_INSERT_Grafico"
Código:

ALTER PROCEDURE [dbo].[sp_INSERT_Grafico]
(
                @Grafico  varbinary(MAX)
)
AS BEGIN
  UPDATE tbl_Ficha SET FOTO=@Grafico
END

Pero la parte de la recuperacion de la imagen no funciona!!.
no se, de que forma se le asigna al la imagen.

alguna idea ? de como se puede recuperar la imagen, usando un proc. con cursor o con paso de parametros ?

poliburro 17-12-2008 16:40:28

No me suena el tipo image en SqlServer, utilizas la versión 2008?


A mi me ha funcionado perfecto usando el tipo blob.

Saludos

petete2008 31-12-2008 18:40:38

Yo uso sql server 2005 y el tipo de campo es IMAGE como han comentado.
Yo tengo el mismo problema. No se como almacenar una imagen en mi BD desde delphi 7 :(

TheJHorse 29-08-2010 18:48:00

thejhorse's solution
 
Un poco tarde tal vez la solucion, pero no deseo dejar este problema sin alguna opcion para resolverlo.

En SQL Server 2000
Estructura de la base de datos "db_prueba":
Código SQL [-]
CREATE TABLE tbl_prueba
(
  codigo INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
  datos  IMAGE
)

un Store procedure, para almacenar datos:
Código SQL [-]
CREATE PROCEDURE spNuevaImagen
  @imgData  IMAGE,
  @iRetorno INT OUTPUT
AS
  INSERT INTO tbl_prueba (datos) VALUES (@imgData)

  SET @iRetorno = @@IDENTITY
GO

En la aplicacion Delphi
Usamos:
Código Delphi [-]
// Agregar DBTables, DB

acConeccion: TADOConnection;
spProcedimiento: TADOStoredProc;
txtImagenTif: TEdit;
btnGuardarImagen: TButton;;
Image1: TImage;
btnCargarImagen: TButton;

Para almacenar la imagen
Código Delphi [-]
procedure TForm1.btnGuardarImagenClick(Sender: TObject);
var
  iResultado: Integer;
  CampoBlob : TStream;
begin
  btnGuardarImagen.Enabled := False;

  // Cambiar Nombre de usuario de la base de datos, su password, servidor SQL
  acConeccion.ConnectionString := 'Provider=SQLNCLI.1;Persist Security Info=False;User ID=NOMBREUSUARIO;Password=TUPASSWORD;Initial Catalog=db_prueba;Data Source=.';

  try
    acConeccion.Open();
  except
    Application.Terminate();
  end;

  spProcedimiento.Close;
  spProcedimiento.Prepared := false;
  spProcedimiento.ProcedureName := 'spNuevaImagen';
  spProcedimiento.Parameters.Refresh;

  spProcedimiento.Parameters.ParamByName('@imgData').LoadFromFile(txtImagenTif.Text, ftBlob);
  spProcedimiento.Parameters.ParamByName('@iRetorno').Value := 0;
  spProcedimiento.Prepared := true;
  spProcedimiento.ExecProc();

  // iResultado almacena el codigo que se creo
  iResultado := spProcedimiento.Parameters.ParamByName('@iRetorno').Value;

  acConeccion.Close();

  btnGuardarImagen.Enabled := True;
end;

Para cargar la imagen:
Código Delphi [-]
procedure TForm1.btnCargarImagenClick(Sender: TObject);
var
  rsDocumentos: TADOQuery;
  blob: TStream;
begin
  // Cambiar Nombre de usuario de la base de datos, su password, servidor SQL
  acConeccion.ConnectionString := 'Provider=SQLNCLI.1;Persist Security Info=False;User ID=NOMBREUSUARIO;Password=TUPASSWORD;Initial Catalog=db_prueba;Data Source=.';

  try
    acConeccion.Open();
  except
    Application.Terminate();
  end;

  rsDocumentos := TADOQuery.Create(Self);

  rsDocumentos.Connection := acConeccion;
  rsDocumentos.Active := False;
  rsDocumentos.SQL.Text := ' SELECT * FROM tbl_prueba WHERE codigo = 1';
  rsDocumentos.Active := True;

  rsDocumentos.First();

  while (not rsDocumentos.Eof) do
  begin
    blob := rsDocumentos.CreateBlobStream(rsDocumentos.FieldByName('datos'), bmRead);
    try
      // Mostramos la imagen
      blob.Seek(0, soFromBeginning);
      Image1.Picture.Graphic.LoadFromStream(blob);

      // Guardamos los datos en disco
      blob.Seek(0, soFromBeginning);

      with TFileStream.Create('c:\archivox.jpg', fmCreate) do
      try
        CopyFrom(blob, blob.Size)
      finally
        Free
      end;
    finally
      blob.Free
    end;

    rsDocumentos.Next();
  end;

  rsDocumentos.Close();
  rsDocumentos.Free();
  acConeccion.Close();
end;

Bueno si vas a usar imagenes JPG, ten en cuenta que debes cargar una imagen JPG en el control Image1, en tiempo de diseño, ya que si no lo haces te saldra error al cargar la imagen de Stream en run time.

olbeup 30-08-2010 14:39:27

Mira este link haber si te sirve.
http://www.clubdelphi.com/foros/showthread.php?t=68872
Un saludo


La franja horaria es GMT +2. Ahora son las 13:04:03.

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