jueves, 18 de diciembre de 2008

Guardar archivos en SQL desde Delphi ??

Pues al principio me parecía imposible o tedioso, hasta que platicando con un amigo me ha dado una opción bastante eficiente; decido compartirla para que también les saque de apuros !!! TOMA NOTA :

PASO 1: Puedes tomar como ejemplo la siguiente tabla creada en SQL 2005 pero que para las versiones anteriores de SQL es lo mismo :

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Archivos_Adjuntos](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Nombre] [nchar](100) NOT NULL,
[Tipo_MIME] [nchar](50) NOT NULL,
[datos] [image] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

PASO 2:  Una vez halla llamado la tabla desde Delphi y tengas lista tu forma utiliza el siguiente codigo para guardar un archivo en la tabla:

procedure TForm2.CargarArchivo;
var FStr: TFileStream; 
BlobStr: TStream; 

begin 
if OpenDialog1.Execute then 
begin 
FStr := 
TFileStream.Create(OpenDialog1.FileName, fmOpenRead or fmShareDenyNone); 
try 
tAdjuntos.Append; 
tAdjuntosNombre.AsString := ExtractFileName(OpenDialog1.FileName); tAdjuntosTipo_MIME.AsString := 
'application/octect-stream'; 
BlobStr := 
tAdjuntos.CreateBlobStream(tAdjuntosdatos, bmWrite); 
try 
BlobStr.CopyFrom(FStr, FStr.Size); 
finally 
BlobStr.Free; 
end; 
tAdjuntos.Post; 
finally 
FStr.Free; 
end; 
end; 
end;

PASO 3: Una vez guardado el archivo en la base de datos, usa el siguiente procedimiento desde delphi para descargarlo:

procedure DescargarArchivo;
var
  BlobStr: TStream;
  FStr: TFileStream;
begin
  if tAdjuntos.IsEmpty then
    Exit;
  if SaveDialog1.FileName <> '' then
    SaveDialog1.FileName := TrailingPathDelimiter(ExtractFilePath(SaveDialog1.FileName)) + Trim(tAdjuntosNombre.AsString)
  else
    SaveDialog1.FileName := Trim(tAdjuntosNombre.AsString);
  if SaveDialog1.Execute then
  begin
    BlobStr := tAdjuntos.CreateBlobStream(tAdjuntosdatos, bmRead);
    try
      FStr := 
TFileStream.Create(SaveDialog1.FileName, fmCreate or fmShareExclusive);
      try
        FStr.CopyFrom(BlobStr, BlobStr.Size);
      finally
        FStr.Free;
      end;
    finally
      BlobStr.Free;
    end;
  end;
end;