PDA

Ver la Versión Completa : campos blob (memo) para almacenar un archivo en mysql


r1d2m3
28-03-2010, 16:00:59
Hola colegas, estoy con el siguiente inconveniente, debo grabar en una base de datos MySQL, un documento (tipo rtf), y, hasta donde he podido avanzar, debo hacerlo bajo un campo tipo blob, hasta aquí todo bien, pero al intentar enviarlo a la bd, tengo un problema de definición del parámetro y me tira un error. Les muestro el código que estoy usando y luego les transcribo el error.


procedure GrabarTexto(varIDTexto:Integer; varStream:TStream);
var
cmdActDatos:TADOQuery;

begin
cmdActDatos:=TADOQuery.Create(nil);
cmdActDatos.Connection:=cnn;
cmdActDatos.Parameters.CreateParameter('nroRs', ftInteger, pdInput, 10, False);
cmdActDatos.Parameters.CreateParameter('descripBreve', ftString, pdInput, 30, False);

//en este línea es donde salta el siguiente error: la aplicación utiliza un valor de tipo no válido
//para la operación actual
cmdActDatos.Parameters.CreateParameter('pltTexto', ftBlob, pdInput, 10000 , false);
cmdActDatos.SQL.Add('insert into tabmaetextos (nroRs, descripBreve, pltTexto) Values (:nroRs, :descripBreve, :ltTexto)');
cmdActDatos.Parameters.ParamByName('nroRs').Value := varIDTexto;
cmdActDatos.Parameters.ParamByName('descripBreve').Value := 'Probando textos';
cmdActDatos.Parameters.ParamByName('pltTexto').LoadFromStream(varStream, ftBlob);
cmdActDatos.ExecSQL;

end;

pido disculpas por lo rudimentario del código, pero se trata de un prototipo que después será emprolijado a los efectos de protegerlo contra fallos, también vi por otros hilos que no se recomienda guardar documentos en las bd, comparto la opinión pero en este caso, los documentos siempre serán de muy bajo peso, razón por la cual la bd no crecerá fuera de control.

Gracias y quedo a la espera de vuestros comentarios.

rgstuamigo
30-03-2010, 22:21:00
A simple vista veo que tienes algunas lineas de códigos que estan por demás y cómo siempre es bueno destruir(liberar lo que se crea), que quisas sean las causantes del error.;)
Prueba hacerlo de ésta manera:
procedure GrabarTexto(varIDTexto:Integer; varStream:TStream);
var cmdActDatos:TADOQuery;
begin
cmdActDatos:=TADOQuery.Create(nil);
try
cmdActDatos.Connection :=cnn;
{No es necesario crear los parametros por código ya que delphi los crea automáticamente
cuando en la consulta SQL anteponemos los dos puntos ":"}
cmdActDatos.SQL.Add('insert into tabmaetextos (nroRs, descripBreve, pltTexto) Values (:nroRs, :descripBreve, :ltTexto)');
cmdActDatos.Parameters.ParamByName('nroRs').Value := varIDTexto;
cmdActDatos.Parameters.ParamByName('descripBreve').Value := 'Probando textos';
cmdActDatos.Parameters.ParamByName('pltTexto').LoadFromStream(varStream, ftBlob);
cmdActDatos.ExecSQL;
finally
cmdActDatos.Free; // Siempre debemos liberar los objetos que hemos creado cuando ya no lo necesitemos
end;
end;
.
Saludos...:)

r1d2m3
31-03-2010, 02:29:22
Gracias por la respuesta, pruebo y luego comento como sale.

Saludos.