Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-01-2008
hluis hluis is offline
Registrado
 
Registrado: ene 2008
Posts: 7
Poder: 0
hluis Va por buen camino
grabar archivos en campo binario

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
Responder Con Cita
  #2  
Antiguo 16-01-2008
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
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.
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web

Última edición por Chris fecha: 16-01-2008 a las 16:18:27.
Responder Con Cita
  #3  
Antiguo 16-01-2008
hluis hluis is offline
Registrado
 
Registrado: ene 2008
Posts: 7
Poder: 0
hluis Va por buen camino
Hola por la respuesta, me mara un error "INVALID CLASS TYPECAST", no se como solucionarlo, en el sql el campo es varbinary, gracias



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;
Responder Con Cita
  #4  
Antiguo 16-01-2008
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
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.
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #5  
Antiguo 17-01-2008
hluis hluis is offline
Registrado
 
Registrado: ene 2008
Posts: 7
Poder: 0
hluis Va por buen camino
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;
Responder Con Cita
  #6  
Antiguo 17-01-2008
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
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.
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #7  
Antiguo 17-01-2008
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Cita:
Empezado por hluis Ver Mensaje
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
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.
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #8  
Antiguo 17-01-2008
hluis hluis is offline
Registrado
 
Registrado: ene 2008
Posts: 7
Poder: 0
hluis Va por buen camino
Hola , muchas gracias, voy hacer lo q decis, no sabie lo del codigo pero lo voy hacer asi, muchas gracias
Responder Con Cita
  #9  
Antiguo 17-01-2008
Avatar de Paoti
Paoti Paoti is offline
Miembro
 
Registrado: may 2003
Ubicación: Monterrey. N.L., México
Posts: 612
Poder: 21
Paoti Va por buen camino
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.
__________________
Estudia y anda en la calle.... que asi serás el doble de listo que los demás...

análisis de información
análisis y diseño de sistemas

Paoti Rios Reséndiz
Responder Con Cita
  #10  
Antiguo 17-01-2008
hluis hluis is offline
Registrado
 
Registrado: ene 2008
Posts: 7
Poder: 0
hluis Va por buen camino
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
Responder Con Cita
Respuesta



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
Mostrar imagen de un campo binario kiketijuana SQL 0 28-06-2006 01:20:33
Archivos de Texto y binario (manejar) h2o_mx OOP 2 20-04-2006 08:28:55
Gráficos en un campo binario mlara Conexión con bases de datos 6 08-12-2005 01:03:08
Convertir Archivos DFM de binario a Texto (Text DFM) DiDi Varios 4 21-04-2005 19:39:43
Como grabar archivos WAV JDNA Varios 1 16-04-2004 03:50:29


La franja horaria es GMT +2. Ahora son las 16:25:17.


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