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.