Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-03-2012
Avatar de TiammatMX
TiammatMX TiammatMX is offline
Miembro
 
Registrado: jun 2006
Ubicación: Universo Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Puebla\Heróica Puebla de Zaragoza\Jardines de San Manuel\Home
Posts: 746
Poder: 18
TiammatMX Va camino a la fama
Question Guardar un archivo PDF en un campo de MS SQL Server 2008 R2.

Buen día, jóvenes delphineros:

Les platico mi problema. El usuario para el que estoy programando desea, más bien, exige poder guardar una serie de archivos *.PDF en varios registros de una tabla de MS SQL Server 2008 R2 (el campo definido como binary), por que desea mostrarlos en una miniatura y tenerlos siempre a mano. Yo estoy plenamente consciente que guardar ésos archivos convertiría la base de datos en un monstruo, pero así lo quieren.

Estuve haciendo una primera aproximación a cómo debería ser el guardado de los datos, pero obviamente no funciona y es donde yo recurro a la sabiduría compartida del grupo, para que me asesoren y/o colaboren en la solución de ésta tarea.

Código Delphi [-]
procedure TfrmContenedor.btnImportarClick(Sender: TObject);
var
  sNombreArchivo : string;
  fsPDF : TStream;
  bfCampo : TBlobField;
begin
  sNombreArchivo := '';
  with dlgAbrirArchivo do
  begin
    InitialDir := ExtractFilePath(Application.ExeName);
    Filter := 'Archivos de Adobe Acrobat (*.pdf)|*.PDF';
    Title := 'Buscar archivos de documentos para el paciente.';
    DefaultExt := '*.pdf';

    if Execute then
      sNombreArchivo := FileName;
  end;

  if sNombreArchivo <> '' then
  begin
    fsPDF := TFileStream.Create(sNombreArchivo,fmOpenRead);
    bfCampo := TBlobField.Create(Self);
    with tblPDFs do
    begin
      fsPDF.Read(bfCampo,fsPDF.Size);
      Connection := qryDocumentos.Connection;
      TableName := 'HY11_DocumentosPacElec';
      Open;
      try
        Insert;
        strngfldPDFsE2_CTRL_PAC.Value := lblExpediente.Caption;
        intgrfldPDFsC42_Documento_ID.Value := StrToInt(Texto2ID(chklstDocumentos.Items.Strings[chklstDocumentos.ItemIndex]));
        bytsfldPDFsHY11_DocumentoElectronico.GetData(bfCampo);
        Post;
      finally
        Close;
      end;
    end;
    fsPDF.Destroy;
    bfCampo.Destroy;
  end;
end;

Nuevamente, se requiere necesariamente que el archivo sea guardado en una tabla. Acepto cualquier tipo de ayuda, hasta apoyo moral.

De antemano, gracias.
__________________
Felipe Eduardo Ortiz López. Delphi programmers does it recursively...

"Un programador, es un creador de universos en donde sólo él es responsable. Universos de complejidad prácticamente ilimitada que se puede crear en forma de programas de ordenador." - Joseph Weizenbaum.

Témele a los profetas... y a aquellos que están listos para morir por "la verdad", ya que como regla general hacen morir a muchos otros con ellos, frecuentemente antes que ellos, y a veces en lugar de ellos. — Umberto Eco
Responder Con Cita
  #2  
Antiguo 14-03-2012
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
Hola Tiammat

Actualmente grabo las fotos y los pdf's dentro de la base de datos, como bien dices, para tenerlas siempre a mano y en cualquier momento.

La función que utilizo funciona correctamente, actualmente utilizo SQL SERVER 2005 sin ningún problema ni error de grabación o recuperación del fichero, tanto JPG o PDF.

Esta función trabaja directamente con un ADOQuery ya definido y conectado a la DB.

Cita:
Devuelve un fichero temporal único
Código Delphi [-]
function GetNewFileTemp(Prefix: String): String;
var
  PathTmp: Array[0..MAX_PATH] of Char;
  FileTmp: Array[0..MAX_PATH] of Char;
begin
  FillChar(PathTmp, SizeOf(PathTmp), #0);
  FillChar(FileTmp, SizeOf(FileTmp), #0);

  GetTempPath(MAX_PATH, PathTmp);
  GetTempFileName(PathTmp, PChar(Prefix), 0, FileTmp);

  Result := FileTmp;
end;

Cita:
Devuelve el pdf del campo query que está activo en ese momento
Código Delphi [-]
function GetFieldDBToPDF(QryDB: TADOQuery): WideString;
var
  Stream: TMemoryStream;
  FileTmp: String;
begin
  Stream := TMemoryStream.Create;
  FileTmp := GetNewFileTemp('~t1');
  try
    TBlobField(QryDB.FieldByName('PDFIMAGEN')).SaveToStream(Stream);
    Stream.Position := 0;
    Stream.SaveToFile(FileTmp);
  finally
    Stream.Free;
  end;
  Result := FileTmp;
end;

Cita:
Graba en el campo query que está activo en ese momento el PDF
Código Delphi [-]
procedure UpdatePDFToFieldDB(QryDB: TADOQuery; Filename: WideString);
var
  Stream: TMemoryStream;
begin
  Stream := TMemoryStream.Create;
  Stream.LoadFromFile(FileName);
  try
    QryDB.Edit;
      (QryDB.FieldByName('PDFIMAGEN') as TBlobField).Clear;
      (QryDB.FieldByName('PDFIMAGEN') as TBlobField).LoadFromStream(Stream);
    QryDB.Post;
  finally
    Stream.Free;
  end;
end;

Cita:
Añade en el campo query que está activo en ese momento el PDF
<Parametros>, ADOQuery, Filename, FieldNameID, FieldValueID
Código Delphi [-]
procedure AddPDFToFieldDB(QryDB: TADOQuery; Filename: WideString; FieldNameID: String; FieldValueID: Integer);
var
  Stream: TMemoryStream;
begin
  Stream := TMemoryStream.Create;
  try
    if (Length(Filename) > 0) then
    begin
      Stream.LoadFromFile(FileName);
      QryDB.Append;
      QryDB.Edit;
        (QryDB.FieldByName('PDFIMAGEN') as TBlobField).Clear;
        (QryDB.FieldByName('PDFIMAGEN') as TBlobField).LoadFromStream(Stream);
        QryDB.FieldByName(FieldNameID).AsInteger := FieldValueID;
      QryDB.Post;
    end
    else begin
      QryDB.Edit;
        (QryDB.FieldByName('PDFIMAGEN') as TBlobField).Clear;
      QryDB.Post;
    end;
  finally
    Stream.Free;
  end;
end;
Este último utilizo el FieldNameID para hacer referencia algún campo de la base de datos FieldValueID es el valor que debe tomar.
Eje.
Si se añade un registro en una DB de ITVPDF ésta DB los campos que tienen son (IDITVDF, PDFIMAGEN, ITVID), el FieldNameID = ITVID y el valor de éste es el FieldValueID = ITVID, ésta función la utilizo para varias DB distinstas, donde el FieldNameID puede variar, por esta razón se envía el campo y el valor.

Estas funciones han sido realizadas gracias a las muchas respuestas sobre el tema en esta comunidad ClubDelphi.

Espero que estas funciones puedan ayudar a toda la comunidad.

Un saludo.
__________________
Al hacer una consulta SQL, haz que los demás te entiendan y disfruten de ella, será tú reflejo de tú saber.
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
Error con W-2008 Server Parsec Varios 8 29-02-2012 19:35:06
Delphi y Sql Server 2008 Paulao Varios 3 02-10-2010 06:20:50
Win Server 2008 Casimiro Notevi Noticias 40 12-03-2008 23:37:43
Guardar cualquier tipo de archivo en un campo en sql server zafmanjp MS SQL Server 7 21-12-2007 18:34:52
Como guardar un Word en un campo SQL SERVER Investment MS SQL Server 1 03-05-2004 15:08:33


La franja horaria es GMT +2. Ahora son las 16:30:15.


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