Grabar archivo PDF, DOC, etc... en SQL-SERVER desde VFP

6,811 views
Skip to first unread message

Oscar Calderon Fuentes

unread,
May 10, 2011, 9:33:30 AM5/10/11
to publice...@googlegroups.com
Estimados,
 
Estoy necesitando guardar en SQL-Server, un archivo PDF.
Probé con campo Image, Binary, y VarBinary, a través de la función FILETOSTR(), pero está claro que por ahí no va el asunto.
 
¿Alguna sugerencia o solución al respecto?
 
Saludos,

--
Oscar Calderón Fuentes
Santiago - Chile
 

Victor Espina

unread,
May 10, 2011, 9:50:54 AM5/10/11
to publice...@googlegroups.com
Por lo que pude leer no es facil pero se puede lograr con un pequeno truco.  En este link te explican como hacerlo paso a paso:



Saludos

Victor Espina

Oscar Calderon Fuentes

unread,
May 10, 2011, 11:40:41 AM5/10/11
to publice...@googlegroups.com
Gracias Víctor,
 
Búscando por la red me encontré con esta solución y me dió resultado:
 

Si quieres guardar archivos de distinto tipo en SQL, deberás guardar en un

campo de tipo text el archivo y en otro campo guardar el nombre y sobre

todo la extension que tenía para saber como deberás mostrarlo luego.

Para guardar un archivo binario en una variable o campo debes utilizar los

siguiente

variable_a_sql = STRCONV(FILETOSTR("C:\DESPIECE.PDF"),13)

SQLEXEC(conexion1,[insert into tabla (nombre,contenido) values

('C:\DESPIECE.PDF',']+variable_a_sql +[' )])

y luego regenerar el archivo con

STRTOFILE(STRCONV(tablasql.contenido,14),tablasql. nombre)

luego para ejecutar la aplicacion relacionada a la extensión deberás usar

APLIC=CREATEOBJECT("WSCript.Shell")

APLIC.RUN(tablasql.nombre)

en este caso se trata de un archivo pdf que se llama despiece



Victor Espina

unread,
May 10, 2011, 12:27:36 PM5/10/11
to publice...@googlegroups.com
Claro, excelente solucion. Lo que haces es llevar el contenido del archivo a Base64 y alli ya se puede enviar directamente. Supongo que el articulo que encontre fue hecho pensando en VFP6, cuando aun no existia la funcion STRCONV().

Saludos

Victor Espina

Hector R. De los Santos

unread,
May 11, 2011, 9:28:18 AM5/11/11
to publice...@googlegroups.com
Yo lo hago asi tambien (usando: STRCONV y STRTOFILE ) , utilizo PostgreSQL con campos de tipo Bytea, con la diferencia que de las conversiones y regerenacion del archivo uso funciones para mas comodidad ;) , para obtener la extencion de el archivo tambien hice otra funcion para guardar esa info en otro campo, asi cuando hago la regeneracion se que extencion es. Guardo todo tipo de documentos (.Doc, pdf, xls, imagenes, etc.)


Suerte!




:: HDS Consultores TI
Servidores | Redes | Programacion | GNU/Linux | PostgreSQL
Web: http://hdsconsultores.net
Blog: http://codigohds.com
Linux User #:320363

Enrique Vasquez - Gmail

unread,
Jul 4, 2011, 10:53:51 AM7/4/11
to publice...@googlegroups.com
Hola Victor,

por pura casualidad he caido en estre 3d. Tengo un pequenio problema un
poco relacionado. yo quisiera poder enviar tramite el SQLEXEC() un
archivo pdf da meter en un campo bytea del postgreSQL. he usado la
solucion que dice el amigo, convirtiendo a Base64 y funciona muy bien.
Pero los que deben leer el archivo (un sitio web) dicen que mejor lo
coloque sin la codifica Base64 y ahi si que no se como hacer. el
articulo al que haces referencia, sirve para quitar el error en archivos
ZIP, a mi meinteresaria saber si existe una forma de enviar una rchivo
por medio de la funcion SQLEXEC()

Saludos

Enrique Vásquez Bautista
cell. 3334497305
Genova - Italia

extremo

unread,
Jul 4, 2011, 11:15:10 AM7/4/11
to Comunidad de Visual Foxpro en Español
Lei tarde este hilo

Oscar yo hago tal cual vistes en internet, pero sabes que por alguna
razon hay pdf que al grabarlos quedan corruptos y al leerlos es
imposible. Aun no he logrado dar con ese problema. Al momento de
grabar la grabacion es exitosa ya que graba lo que uno manda pero
cuando lees el pdf para revisar, te das cuenta que se grabo mal, ya
que el acrobat te envia un mensaje de archivo dañado y es imposible
abrir. Esto ocurre ocacionalmente , ha sido un problema pero que aun
no he logrado dar con una solucion.

Bendiciones
> > Victor Espina- Ocultar texto de la cita -
>
> - Mostrar texto de la cita -

Walter R. Ojeda Valiente

unread,
Jul 4, 2011, 4:17:57 PM7/4/11
to publice...@googlegroups.com
¿No te sirve aplicar automatizacón Word? A mí hasta ahora me ha funcionado sin problemas.

Saludos.

Walter.



> Date: Mon, 4 Jul 2011 08:15:10 -0700
> Subject: [vfp] Re: Grabar archivo PDF, DOC, etc... en SQL-SERVER desde VFP
> From: protech...@gmail.com
> To: publice...@googlegroups.com

extremo

unread,
Jul 4, 2011, 6:19:09 PM7/4/11
to Comunidad de Visual Foxpro en Español
Hola Walter,

en mi caso no me sirve ya que los documentos que se graban en la BD
son de distintos tipos ejemplo, PDF ,DOC, XLS ,JPG , etc.

Saludos


On 4 jul, 16:17, "Walter R. Ojeda Valiente" <w...@hotmail.com> wrote:
> ¿No te sirve aplicar automatizacón Word? A mí hasta ahora me ha funcionado sin problemas.
>
> Saludos.
>
> Walter.
>
>
>
> > Date: Mon, 4 Jul 2011 08:15:10 -0700
> > Subject: [vfp] Re: Grabar archivo PDF, DOC, etc... en SQL-SERVER desde VFP
> > From: protech.ven...@gmail.com
> > > - Mostrar texto de la cita -- Ocultar texto de la cita -

Enrique Vasquez - Gmail

unread,
Jul 5, 2011, 10:11:06 AM7/5/11
to publice...@googlegroups.com
hola,

yo ya resolvi el problema pero contro una base de datos PostgreSQL,
usando la funcion nativa del PostgreSQL decode...

en practica lo paso el archivo convertido con el strconv() y en la misma
linea le indico al PostgreSQL di decodificarlo al crear el registro con
la funcion decode(cadena,'base64')

Saludos

Enrique Vásquez Bautista
cell. 3334497305
Genova - Italia

norma venzor

unread,
Dec 10, 2012, 3:06:10 PM12/10/12
to publice...@googlegroups.com
Hola 
Hola. 
Estoy desarrollando un sistema para descarga de archivos PDF, los cuales los tengo guardados en una tabla de MySql, la manera en que los guarde es en un campo tipo text en el que almacene la ruta completa del archivo.
Ejemplo: C:/wamp2/facturas/7289.pdf
tengo un script en php que me lanza la descarga, mi pregunta es si tienen alguna manera de cambiar el nombre del link, por que me aparece toda la ruta y yo solo quiero que me muestre el numero de factura! alguien me puede ayudar? 

JC SEGURA

unread,
Jun 9, 2014, 10:49:44 PM6/9/14
to publice...@googlegroups.com
?SQLEXEC(conexionsql,[SELECT * FROM p_personal_cv WHERE cod_emp+id_person='001'+'P0001' ],'tablasql')

select tablasql
go top
STRTOFILE(STRCONV(tablasql.contenido,14),tablasql.ruta_file)
APLIC=CREATEOBJECT("WSCript.Shell")
APLIC.RUN(tablasql.contenido)

QUE RISA DE VERAS OSEA SI SACO EL ARCHIVO DE C:\ NO FUNCIONA..... POR FAVOR NO ME HAGAS REIR
SI SE GUARDA EN SQL PERO LUEGO LEES EL ARCHIVO DE LA RUTA Y LO CARGAR EN PDF.. 
ESTO NO UNA SOLUCION SINO UNA ESTAFA

Miguel Antúnez

unread,
Jun 10, 2014, 8:43:24 AM6/10/14
to publice...@googlegroups.com
Hasta ahora la mejor opción que uso para guardar archivos en SQL SERVER es con la tecnología FILESTREAM.
te dejo un link con el tema en el grupo.

Saludos.

--
Miguel Angel Antúnez Camones
mant...@gmail.com

Douglas Sánchez

unread,
Jun 11, 2014, 1:58:16 AM6/11/14
to publice...@googlegroups.com
Hola Miguel,  y esto es aplicable a mysql?

Saludes

Douglas
--
Ing. Douglas Sánchez Guillén
      Consultor Informatico
Claro: 505 88495476

Miguel Antúnez

unread,
Jun 11, 2014, 9:06:59 AM6/11/14
to publice...@googlegroups.com
Estoy seguro que no existe esta tecnología en Mysql, solo hacerlo de la manera tradicional, en campos de tipo Blob Cblob.

Alfonso Ramirez Diaz

unread,
Jun 11, 2014, 4:42:28 PM6/11/14
to publice...@googlegroups.com
En todos los motores como SQL SERVER, MYSQL, POSTGRESQL, etc. almaceno los archivos de la siguiente manera:

En SQL SERVER utilizo el campo TEXT
En MYSQL utilizo el campo MEDIUMTEXT
En PostgreSQL utilizo el campo TEXT
Etc...

Para guardar hago algo como esto:

m_texto = FILETOSTR(m_archivo)
m_texto = STRCONV(m_texto,13)
m_sql = "INSERT INTO archivos ( nombre, texto ) VALUES ( ?m_nombre, ?m_texto )"
SQLEXEC(lnHandle,m_sql)

Y para recuperar el archivo hago algo como lo siguiente:

IF SQLEXEC(lnHandle,"SELECT texto FROM archivos WHERE nombre=?m_nombre","micursor")>0

   m_texto = STRCONV(micursor.texto,14)
   m_nombre = "c:\temp\" + m_nombre
   STRTOFILE(m_texto,m_nombre)
   SHELLEXEC(m_nombre)

ENDIF

Y también he creado una rutina que subo el archivo por partes mostrando una barra de progreso pero utilizando los mismos campos e instrucciones similares.

Edwin Duran

unread,
Mar 18, 2016, 9:00:06 AM3/18/16
to Comunidad de Visual Foxpro en Español
Buen Dia
Aunque el post es viejo quise, continuar el mismo hilo, 
estoy con sql server 2005 express  probando el ejemplo de alfonso y no tengo error al guadar pero la información de m_texto no se esta grabando en la tabla, pero lnom_file si se realiza sin problema, el valor de m_texto lo almacene en campo editbox lo copie y fui directo a copiarlo en el campo de la tabla y no me deja, se queda en blanco.

este es mi codigo, 

lFILE       = Alltrim(Thisform.txtRUTA.Value)
lnom_file  = Justfname(lFILE)
m_texto   = FILETOSTR(lFILE)
m_texto   = STRCONV(m_texto,13)
thisform.edit1.Value = m_texto

Local osqldata As sqldata Of sqldata.sqldata
osqldata=Createobject("sqldata.sqldata")
osqldata.psqlcomienzo(_Screen,"1")
osqldata.psqlcomtran(_Screen,"1")
Marchivo = _Screen.sqldatabase+"archivo"  && nombre de la tabla en sqlsever

*Campo y tipo de datos
*nom_file  varchar(50)
*file_foto   text

TEXT TO m_sql NOSHOW text  

INSERT into <<Marchivo>> (        nom_file,          file_foto ) VALUES
                                          ( '<<Lnom_file>>', '<<m_texto>>')


ENDTEXT

osqldata.psqlcomando(_Screen,"1",m_sql) 
osqldata.psqlfintran(_Screen,"1")
osqldata.psqlfinal(_Screen,"1")

Edwin Duran

unread,
Mar 18, 2016, 9:02:37 AM3/18/16
to Comunidad de Visual Foxpro en Español
Me falto anexar el contenido de la información generada
base64.txt

Víctor Hugo Espínola Domínguez

unread,
Mar 18, 2016, 9:17:26 AM3/18/16
to publice...@googlegroups.com
Cambia

INSERT into <<Marchivo>> (        nom_file,          file_foto ) VALUES
                                          ( '<<Lnom_file>>', '<<m_texto>>')
por:

INSERT into <<Marchivo>> (        nom_file,          file_foto ) VALUES
                                          (?m.Lnom_file, ?m.m_texto)





Saludos,
Víctor.
Lambaré - Paraguay.

Edwin Duran

unread,
Mar 22, 2016, 9:36:15 AM3/22/16
to Comunidad de Visual Foxpro en Español
Gracias Victor Hugo

Realizo lo que me indicas y me aparece el siguiente error.

Estoy buscando y no he dado con el error.
error.png

Víctor Hugo Espínola Domínguez

unread,
Mar 22, 2016, 10:46:50 AM3/22/16
to publice...@googlegroups.com
Es probable que en la definición de la tabla haya algún campo que no admita null y no tenga el valor por default. Puedes mostrarnos el script de creación de la tabla?


Saludos,
Víctor.
Lambaré - Paraguay.


Edwin Duran

unread,
Mar 22, 2016, 12:02:23 PM3/22/16
to Comunidad de Visual Foxpro en Español
Mira la informacion

USE [hydsoft]
GO
/****** Object:  Table [dbo].[snbdemp_foto]    Script Date: 03/22/2016 12:00:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[snbdemp_foto](
[cod_emp] [varchar](6) COLLATE Modern_Spanish_CI_AS NULL,
[nom_file] [varchar](50) COLLATE Modern_Spanish_CI_AS NULL,
[file_foto] [text] COLLATE Modern_Spanish_CI_AS NULL,
[id] [int] IDENTITY(1,1) NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Nombre del archivo' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'snbdemp_foto', @level2type=N'COLUMN',@level2name=N'nom_file'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Se guanda el archivo de la foto calculado en base64' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'snbdemp_foto', @level2type=N'COLUMN',@level2name=N'file_foto'

Víctor Hugo Espínola Domínguez

unread,
Mar 22, 2016, 4:31:54 PM3/22/16
to publice...@googlegroups.com
Hola Edwin

Con el script que enviaste creé la tabla y grabé imágenes sin problemas con el siguiente código:

Local laError[1], lcFile, lcFoto, lcInsert, lcNom_File, lcTabla, lnConexion, lnOK

lnConexion = Sqlstringconnect                     ;
    (                                             ;
      [Driver={SQL Server};Server=LocalHost\sqlexpress;Database=Northwind;Trust] ;
      )

If m.lnConexion < 1
    Messagebox("NO conectado!-(")
    Cancel
Endif

lcFile       = Getpict()
lcNom_File = Justfname(m.lcFile)
lcFoto       = Filetostr(m.lcFile)
lcFoto       = Strconv(m.lcFoto, 13)

lcTabla    = "snbdemp_foto"

Text To m.lcInsert Textmerge Noshow Pretext 15
    INSERT INTO <<m.lcTabla>> (nom_file, file_foto )
        VALUES (?m.lcNom_File, ?m.lcFoto)

Endtext

lnOK = SQLExec(m.lnConexion, m.lcInsert)
If m.lnOK < 0
    Aerror(laError)
    Messagebox(m.laError[2])
Endif

Prueba este programa.


Saludos,
Víctor.
Lambaré - Paraguay.


Edwin Duran

unread,
Mar 23, 2016, 1:30:20 PM3/23/16
to Comunidad de Visual Foxpro en Español
Gracias ya funciona, mil gracias, el erro lo tenia en la clase
Reply all
Reply to author
Forward
0 new messages