Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Problema para guardar datos desde campo Blob al disco duro (https://www.clubdelphi.com/foros/showthread.php?t=72842)

phirum1984 15-03-2011 14:08:03

Problema para guardar datos desde campo Blob al disco duro
 
Hola a todos/as.

Tengo una aplicación de mensajería entre usuarios que he programado y que se conecta a una base de datos MySql Online. Lo que quiero hacer es que cuando la aplicación inicie compruebe si hay una versión más nueva (subida previamente por mí), y si la hay descargar el ejecutable de la versión más nueva y de esa forma digamos que el programa se "autoactualiza".

Bien, el procedimiento para subir el archivo binario (.exe) a un campo de tipo LongBlob en la BD MySql ya está implementado y en principio funciona bien, no obstante pongo lo que sería el código (no explícitamente ya que no es relevante):
Código Delphi [-]
var
  qry: TQuery;
  sql: String;
begin
 ...
  sql:='UPDATE Tabla SET Archivo=:file WHERE Condicion';
  qry.Sql.Add(sql);
  qry.ParamByName('file').LoadFromFile('C:\Archivo.exe', ftBlob);
  qry.ExecSQL;
  qry.Close;
end;
El procedimiento es correcto y en la BD puedo ver que efectivamente el campo LongBlob se ha modificado y supuestamente contiene el archivo ejecutable subido, que ocupa unos 2.2Mb, y así se muestra en la misma BD.


El problema viene cuando intento descargar el archivo de la BD y guardarlo en el disco duro, siempre me descarga mi archivo ejecutable pero de tamaño 32Kb y que lógicamente no funciona. En el caso de que suba un archivo de menos de 32Kb, lo descarga bien y funciona correctamente. Recuerdo que en la propia BD MySql el archivo está supuestamente bien guardado y ocupa 2.2Mb.
El código usado es el siguiente:
Código Delphi [-]
var
  qry: TQuery;
  sql: String;
begin
 ...
  sql:='SELECT Archivo FROM Tabla WHERE Condicion';
  qry.Sql.Add(sql);
  qry.Open;
  TBlobField(qry.FieldByName('Archivo')).SaveToFile(C:\Descarga\Archivo.exe);
  qry.Close;
end;
No hay errores y de hecho me genera la descarga pero como ya he dicho de un máximo de 32Kb, creo que es como si hubiera algún límite o similar, pero la BD no lo impone ya que la propia BD me dice que el campo LongBlob ocupa 2.2Mb.

Por favor, ¿alguna sugerencia, idea o alguna otra forma de hacerlo?.
Si necesitais cualquier información adicional o no entendeis alguna cosa por favor pedidmelo.

De antemano, muchas gracias y un saludo.

Casimiro Notevi 15-03-2011 14:28:54

Código Delphi [-]
TBlobField(qry.FieldByName('Archivo')).SaveToFile(C:\Descarga\Archivo.exe);

¿No deberías poner el nombre del fichero entre comillas?

Código Delphi [-]
TBlobField(qry.FieldByName('Archivo')).SaveToFile('C:\Descarga\Archivo.exe');

phirum1984 16-03-2011 15:22:43

Ups, si, tienes razón, ha sido un error sintáctico, en la aplicación lo tengo bien, pero no es ese el problema, sigue sin funcionarme, alguna ayuda o sugerencia por favor...

Casimiro Notevi 16-03-2011 15:24:41

Pues entonces pega aquí exactamente el código que estás usando.

phirum1984 21-03-2011 11:59:07

Ok, pongo el código exacto que utilizaba, hay algunas funciones implementadas por mí que sólo sirven para mostrar un cierto mensaje de error en caso de fallo y cosas así, son irrelevantes para el caso que nos ocupa aquí ;)

Código para subir el archivo .exe:
Código Delphi [-]
var
  qry_Version: 
  TQuery;
  sql: String; 
  ...
  sql:='UPDATE Administracion SET Valor=''' + txt_Version.Text + ''', Archivo=:archivo '+ 'WHERE Tipo=''UltimaVersion''';
  try
    qry_Version.Close; 
    qry_Version.SQL.Clear;             
    qry_Version.SQL.Add(sql);             
    qry_Version.ParamByName('archivo').LoadFromFile(txt_Ruta.Text, ftBlob);             
    qry_Version.ExecSQL;             
    ShowMessage('Nueva versión subida correctamente.');            
    Close;          
  except             
    Error(10, mtError);          
  end;          
  qry_Version.Close;

El código usado para descargar el archivo subido previamente es:
Código Delphi [-]
var
  qry_Version: TQuery;   
  sql: String; 
  ...  
  sql:='SELECT Archivo FROM Administracion WHERE Tipo=''UltimaVersion''';       
  try          
    Abrir_qry(qry_Version, sql);          
    if (qry_Version.RowsAffected>0) then begin
      TBlobField(qry_Version.FieldByName('Archivo')).SaveToFile(dlg_Guardar.Filename);             
      ShowMessage('Archivo descargado.' +#10 + dlg_Guardar.FileName);          
    end          
    else Error(53, mtError);       
  except          
    Error(10, mtError);       
  end;
  qry_Version.Close;

Es cuando descargo el archivo que sólo me lo crea de 32Kb.
Gracias de antemano ;)

iparraguirre89 16-10-2013 18:39:35

Revisa los parametros del my.ini
 
Revisa el parámetro:
max_allowed_packet, es el que se encarga de limitar el tamaños de los archivos.
Ej.
max_allowed_packet=100mb


La franja horaria es GMT +2. Ahora son las 20:03: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