Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   grabar archivos en campo binario (https://www.clubdelphi.com/foros/showthread.php?t=52282)

hluis 16-01-2008 14:00:13

grabar archivos en campo binario
 
:confused: Hola, soy novato en esto y tengo q , grabar archivos .doc, .xls, .pdf, o jpg, en un campo binario.
tengo Sql Server 2005

id int
nombre varchar(50)
archivobin varbinary(50)
Algo simple,

No se como Garabr el archivo en la Bd, y depsues tendria q poder extraerlo y mostrarlo.
Me pueden ayudar, o donde puede verlo, gracias
Luis:confused:

Chris 16-01-2008 16:15:56

Hola hluis, primero que todo, cuando utilizas los componentes de conección a DB de la VCL de delphi, en estos casos no tienes que preocuparte del tipo de base de datos o servidor que utilizes.
Bien, como a forma de consejo, primero ubieses hecho una búsqueda, en este hilo se habla como agregar imágenes, pero el código que postie en esa ocación, perfectamente te puede servir para guardar cualquier tipo de datos en el campo blob.

Por otro lado, tienes además la inquietud de poder recuperar el archivo, y abrirlo nuevamente, por ejemplo en word. Bien, intenta invertir la el procedimiento posteado en el hilo ya mencionado.

saludos.

PD.: Te recomiendo que hagas una búsqueda de un truco o hilo "Detectar cuando se cierra un archivo" verás que seguramente lo vas a necesitar. Estoy seguro que por ahí anda en el club.

hluis 16-01-2008 20:12:25

Hola por la respuesta, me mara un error "INVALID CLASS TYPECAST", no se como solucionarlo, en el sql el campo es varbinary, gracias:confused::confused:



FileStore.open;
FileStore.Insert;
FileStore.FieldByName('ObjectTypeId').Value := 1;
FileStore.FieldByName('ObjectId').Value := IWDBLookupComboBox4.KeyValue;
FileStore.FieldByName('DocumentoTpId').Value := IWDBLookupComboBox5.KeyValue;
FileStore.FieldByName('Descripcion').Value := IWEdit1.Text;
FileStore.FieldByName('Nombre').Value := ExtractFileName(IWFile1.FileName);

{ACA MARCA EL ERROR INVALID CLASS TYPECAST}
try
blob := FileStore.CreateBlobStream(FileStore.FieldByName('ArchivoBin'),
bmWrite);
blob.Seek(0, soFromBeginning);
fs := TFileStream.Create(IWFile1.FileName, fmOpenRead or fmShareDenyWrite);
try
blob.CopyFrom(fs, fs.Size)
finally
fs.Free
end;
finally
blob.Free
end;
FileStore.Post;

Chris 16-01-2008 22:02:08

No me queda claro en cual linea te manda el error, si es en:
Código Delphi [-]
FileStore.FieldByName('Nombre').Value := ExtractFileName(IWFile1.FileName);

o antes de iniciar el Try, ya que donde comentastes, es una línea en blanco.
Mi experiencia en SQL Server es nula, por lo tanto en ese aspecto no te podría ayudar. Espero no mal interpretar el mensaje de error, pero a mi parecer, es que el campo no acepta archivos binarios. ¿Estás seguro de que el tipo de dato "varbinary" es un campo BLOB -por decirlo así-.

Por otro lado, por el momento intenta depurar el código, comenta el código que agrega la imágen -desde donde inicia el primer try-, también puedes modificar la asignación del campo "NOMBRE" veo que en este momento la tienes así:
Código Delphi [-]
 FileStore.FieldByName('Nombre').Value := ExtractFileName(IWFile1.FileName);
intentala cambiar por:
Código Delphi [-]
 FileStore.FieldByName('Nombre').AsString := ExtractFileName(IWFile1.FileName);

Si aún, tu problema no se resuelve con esto, ve comentado cada asignación, una por una, hasta que encuentres donde está el pegón, a mi parecer es el tipo de dato, ya que según veo, el código está sin problemas.

Saludos.

hluis 17-01-2008 12:51:59

Hola gracias por la respuesta, el error lo marca en l aste linea al hacer el trace:
blob := FileStore.CreateBlobStream(FileStore.FieldByName('ArchivoBin'),
bmWrite);

error "INVALID CLASS TYPECAST",

Muchas Gracias, espero rta.
slds
Luis

FileStore.open;
FileStore.Insert;
FileStore.FieldByName('ObjectTypeId').Value := 1;
FileStore.FieldByName('ObjectId').Value := IWDBLookupComboBox4.KeyValue;
FileStore.FieldByName('DocumentoTpId').Value := IWDBLookupComboBox5.KeyValue;
FileStore.FieldByName('Descripcion').Value := IWEdit1.Text;
FileStore.FieldByName('Nombre').Value := ExtractFileName(IWFile1.FileName);

try
{ACA MARCA EL ERROR INVALID CLASS TYPECAST}
blob := FileStore.CreateBlobStream(FileStore.FieldByName('ArchivoBin'),
bmWrite);

blob.Seek(0, soFromBeginning);
fs := TFileStream.Create(IWFile1.FileName, fmOpenRead or fmShareDenyWrite);
try
blob.CopyFrom(fs, fs.Size)
finally
fs.Free
end;
finally
blob.Free
end;
FileStore.Post;

Chris 17-01-2008 16:06:59

Este problema, a mi parecer, se debe al tipo de datos de la base de datos. Ya que no sé adsolutamente nada sobre MS SQL Server, no puedo ayudarte en ese aspecto. Intenta abrir otro hilo en la sección pertinente (SQL Server) para obtener ayuda más calificada de la que yo puedo proporcionarte.

Sin envargo, estuve biendo el tipo de error "INVALID TYPECAST" en msdn2 y encontré esto , tal parece que cuando el valor del campo es nulo, SQL server devuelve un valor especial DBNULL que pueda ser que delphi no lo sepa manejar. Te doy estas observaciones, porque si vas a hacer una pregunta, tengas la mayor cantidad de inforación posible que puedas obtener.

Como última sugencia, intenta cambiar el segundo parámentro del Create BlobStream con el que creas la variable blob (en la línea donde te da el error), cambialo de bmWrite a bmReadWrite

Saludos.

PD.: Para escribir código de delphi, utiza las etiquetas correspondientes, es más comodo leer el código con ellas.

Chris 17-01-2008 16:14:44

Cita:

Empezado por hluis (Mensaje 258438)
:confused: Hola, soy novato en esto y tengo q , grabar archivos .doc, .xls, .pdf, o jpg, en un campo binario.
tengo Sql Server 2005

id int
nombre varchar(50)
archivobin varbinary(50)
....
Luis:confused:

Luis, no será también, que el archivo no alcanza en ese campo varbinary (50). Porque, a modo de prueba, utilizas temporalmente un campo de tipo Image.

Ahora, como una sugerencia más, puedes modificar la línea del error por está:
Código Delphi [-]
 try
 {ACA MARCA EL ERROR INVALID CLASS TYPECAST}
 blob := FileStore.CreateBlobStream(TVarBytesField(FileStore.FieldByName('ArchivoBin')),
 bmWrite);

Utilizo TVarBytesField, porque creo que el lo mejor para el tipo de campo VarBinary, también podes probrar con TBlobField. Informate sobre ellos en la ayuda de delphi.

Saludos.

hluis 17-01-2008 18:14:19

Hola , muchas gracias, voy hacer lo q decis, no sabie lo del codigo pero lo voy hacer asi, muchas gracias

Paoti 17-01-2008 18:36:36

aparte, es conveniente que pongas el tipo varbinary(MAX) para no preocuparte del tamaño del archivo.


ya no se recomienda por la propia Microsoft usar al tipo de dato Image, en sql server 2005 existe por compatabilidad.



saludos.

hluis 17-01-2008 18:58:14

Hola gracias, por la salvedad, es que cuendo cree la BD, fue sobre el de Pruebas, ahi hay todavia un 2000, Ya en el 2005 lo cambie como decis. slds


La franja horaria es GMT +2. Ahora son las 02:01:11.

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