Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MySQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-11-2015
marvajes marvajes is offline
Registrado
NULL
 
Registrado: nov 2015
Posts: 6
Poder: 0
marvajes Va por buen camino
Almacenar y bajar PDF en MYSQL Delphi 2010 desktop

Hola foro, llevo algo de tiempo desarrollando un proyecto para la Universidad. Tengo problema, en los requerimientos del sistema se pide, almacenar archivos en formato PDF(tipo repositorio), los cuales pueden ser cargados(aplicación desktop a mysql ) y descargados(consulta el archivo lo baja y almacena físicamente en una ruta del hd) desde el sistema(aplicación desktop).

He estado investigando al respecto y he logrado cargar un archivo en la base de datos con el siguiente codigo
Código Delphi [-]
  
    SQL.SQL.Add('INSERT INTO ARCHIVO VALUES(:ID,ATO)');
    SQL.ParamByName('ID').asInteger:= 1;
    SQL.ParamByName('DATO').LoadFromFile('1.pdf',ftblob);
    try
      SQL.Execute;
    finally
        //ERROR
    end;

El archivo se almacena en la tabla Archivo, sin embargo no se si sube archivo de forma correcta, adicional a esto, puedo subir archivos con un tamaño <= 512 kb, al intentar subir archivos mas pesados, el sistema se congela y deja de responder, no se si sea un problema de programación o de la base de datos, ya que tengo entendido que para archivos mas pesados es necesario configurar una variable en mysql.

El asunto es que ya almacenado el archivo, no se como bajarlo por medio de una consulta y almacenarlo en una ruta del disco, para que el usuario pueda consultarlo.
Alguien que pueda apoyarme con este tema, le estaría muy agradecido!.
Trabajo en Windows 7, Mysql, Componente Unidac para establecer la conexión a la BD. (Componente para el query, utilizo unidac, pero no tengo problema al trabajar con ADO, BDE, Interbase, etc)
Responder Con Cita
  #2  
Antiguo 14-11-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Hola marvajes,

Primero que nada en un bloque try-finally, el finally no es donde se captura el "error". El finally es un bloque que se ejecuta luego del try, sin importar si hubo una excepcion, un Break, un Exit, un Continue, etc.

Para catpturar errores, se usa el bloque try-except, asi:

Código Delphi [-]
  try
    { 1 Codigo a ejecutar }
  except
    { 2. Si en 1 se produjo una excepcion, el flujo del programa viene inmediatamente a 2 }
  end;

Para mas info sobre excepciones se suele recomendar el libro "La Cara Oculta de Delphi", que esta en el FTP del club. Tambien hay mogollon de informacion en el foro e internet

Con respecto a tu problema, lo que te falto comentar es como esta definida tu tabla Archivo, no vaya a ser que tenga como limite justamente los 512kb
Responder Con Cita
  #3  
Antiguo 14-11-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Esta es la forma que yo opero con archivos, no es con los componentes UniDAC pero supongo que para todos es la misma,

Para guardarlo:

Código Delphi [-]
var
  LStream: TStream;
begin
  LStream := TFileStream.Create(RutaAlPdf, fmOpenRead);
  try
    Parameters.ParamByName('PDF').LoadFromStream(LStream , ftVarBytes);
  finally
    LStream .Free;
  end;
end;

Para obtener el archivo:

Código Delphi [-]
procedure DownloadPdf(const RutaDescarga: string);
var
  LQuery: TXXXQuery; // componente unidac, ado, etc para ejecutar consultas
begin
  LQuery := .... // crear query, configurar la conexion...
  try
    LQuery.SQL.Text := ' SELECT * FROM Archivo '; // ejecutamos una consulta SQL, podria tener WHERE, etc...
   LQuery.Open; // abrimos
   TBlobField(LQuery.FieldByName('Dato')).SaveToFile(RutaDescarga);
  finally
    LQuery.Free;
  end;
end;
Responder Con Cita
  #4  
Antiguo 14-11-2015
marvajes marvajes is offline
Registrado
NULL
 
Registrado: nov 2015
Posts: 6
Poder: 0
marvajes Va por buen camino
Muchas gracias por la ayuda.

Muchas gracias por tu ayuda AgustinOrtu, primeramente por la corrección, pues tenia una idea errónea del uso de try finally.
Con el tema de bajar el archivo, solo hice una pequeña modificación al código.

Insertar el archivo en la Base de datos
Código Delphi [-]
  var
  LStream: TStream;
begin
   SQL.SQL.Add('INSERT INTO ARCHIVOS VALUES(:ID,ATO)');
   SQL.ParamByName('ID').AsInteger:=1;
   SQL.ParamByName('DATO').LoadFromFile('1.pdf',ftblob);
    try
      Sql.ExecSQL;
    finally
        //ERROR
    end;
end;

Recuperar el archivo y almacenar en disco duro
Código Delphi [-]
var
  LStream: TStream;
begin
  LStream := TFileStream.Create('1.pdf', fmOpenRead);
    Sql.SQL.Add('SELECT * FROM ARCHIVOS');
  try
      SQL.Open; // abrimos
   TBlobField(SQL.FieldByName('NOMBRE')).SaveToFile('C:\u\1.pdf');
  finally
    LStream .Free;
  end;
end;

Cabe mencionar que inicialmente al recuperar el archivo, este aparecia corrupto o no mostraba el contenido y esto debido justamente como indicaste el limite, utilizado inicialmente BLOB ≈ 64KB, MEDIUMBLOB ≈ 16MB and LONGBLOB ≈ 4GB. Lo deje en MEDIUMBLOB y perfecto.
Muchas gracias por la ayuda amigo!.
Saludos.
Responder Con Cita
  #5  
Antiguo 07-06-2019
petercat petercat is offline
Miembro
 
Registrado: feb 2012
Posts: 23
Poder: 0
petercat Va por buen camino
Buenas Leyendo este post me cabe una duda.
Y si en vez de guardar el archivo en una ruta especifica pudiera abrirlo con AcroPDF??
Como podria hacerlo.
Yo puedo abrir archivos pdf desde rutas especificas pero en mi caso quiero abrir dicho archivo pdf pero desde la propia base de datos sin tener que llevarlo a ningun lugar del disco duro.


Esto es posible??
Responder Con Cita
  #6  
Antiguo 07-06-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is online now
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.022
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Crea un hilo nuevo con tu duda, no aportas nada a la solución de este hilo.
De todas formas, haz una búsqueda por los foros, es un tema que se ha tratado otras veces.
No olvidas repasar nuestra guía de estilo, gracias
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
MySQL y ADO desde Delphi 2010 mjjj MySQL 9 21-01-2013 20:03:57
No puedo conectar Mysql con delphi 2010 juanmarchettini Conexión con bases de datos 8 17-04-2011 21:47:34
MySQL y DBNavigator Delphi 2010 johnytsekieng Conexión con bases de datos 4 16-02-2011 15:45:48
Mysql con delphi 2010 consulta tabla gdlrinfo SQL 6 29-09-2010 02:15:39
Firebird, Mysql y Delphi 2010 tec Varios 3 16-04-2010 16:34:51


La franja horaria es GMT +2. Ahora son las 12:30:43.


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