Unas preguntas que frecuentemente hacen quienes empiezan con Firebird son:
¿Conviene guardar las fotografías dentro o fuera de la Base de Datos?
En el caso de Firebird se recomienda guardarlas dentro, las ventajas son:
-
- La fotografía está siempre disponible. Si se copia la Base de Datos en otra computadora las fotografías también estarán allí
- Si se hace un backup, las fotografías también estarán en el backup
- Si se hace un shadow, las fotografías también estarán en el shadow
- Solamente pueden insertar fotografías los usuarios autorizados
- Solamente pueden borrar fotografías los usuarios autorizados
- Solamente pueden modificar fotografías los usuarios autorizados
- Solamente puede ver fotografías los usuarios autorizados
- El acceso a las fotografías es rapidísimo
- No necesitas tener una carpeta compartida para que los usuarios puedan ver las fotografías
O sea que no existe la posibilidad de que tengas los datos y no las fotografías que corresponden a esos datos. Por ejemplo, si en tu tabla ALUMNOS tienes sus fotografías siempre podrás verlas, si las fotografías estuvieran afuera de la Base de Datos podrías copiarla sin copiar también la carpeta donde guardas las fotografías. O alguien podría borrar la carpeta donde guardas las fotografías. O algún gracioso modificar esas fotografías y quizás ponerles bigotes y barbas, escribir texto ofensivo, cosas así.
En cambio, si la fotografía se guarda dentro de la Base de Datos y alguien quiere realizar algún tipo de vandalismo siempre podrás saber quien fue, desde cual computadora y cuando, ya que puedes guardar los datos del usuario que manipuló cada fotografía.
Si guardas las fotografías afuera de la Base de Datos entonces necesitarás que la carpeta donde se encuentran esas fotografías sea compartida para que puedan acceder a ellas todos los usuarios. Sin embargo, tener carpetas compartidas implica un gran riesgo de seguridad porque desde muchas computadoras es posible acceder a ellas y por lo tanto no es aconsejable tenerlas. Si las fotografías (y demás contenido multimedia) se encuentran dentro de la Base de Datos entonces no necesitas usar carpetas compartidas y todo es más seguro y más confiable.
¿Cómo se guardan las fotografías dentro de la Base de Datos?
Como la gran mayoría de las fotografías tienen un tamaño mayor a 32.767 bytes no podemos utilizar el tipo de datos VARCHAR para guardarlas, ya que ése es su límite máximo. En su lugar usamos el tipo de datos BLOB, ya que éste no tiene límites. En un BLOB podemos guardar no solamente fotografías sino también música, vídeo, documentos PDF, documentos Word, planillas Excel, etc.
Cuando una columna se declara que es de tipo BLOB el Firebird guarda en esa columna un número de 8 bytes que indica en cual página de la Base de Datos se encuentra el contenido. O sea, lo que se guarda en la columna no es el contenido del BLOB sino un puntero, una referencia, al lugar dentro de la Base de Datos donde se encuentra el contenido de ese BLOB. Este concepto de puntero es muy similar al usado en los campos memo de las tablas .DBF
De esta manera, si escribes el comando SELECT * FROM ALUMNOS no se están trayendo las fotografías de todos los alumnos sino solamente las referencias a esas fotografías. Haciéndolo de esta manera el Firebird consigue que la velocidad sea rapidísima porque trae solamente 8 bytes por cada fila en lugar de, por ejemplo, los 85.000 bytes que en promedio ocupa cada fotografía.
Cuando quieres obtener una fotografía para mostrársela al usuario debes específicamente pedirle al Firebird esa fotografía.
¿Cómo se declara una columna que contendrá fotografías?
Hay dos tipos de BLOB prefijados: subtipo 0 (para archivos binarios) y subtipo 1 (para archivos de texto).
En general para fotografías se usa el subtipo 1.
NOTA PARA QUIENES USAN VISUAL FOXPRO: El subtipo 0 pasa al Visual FoxPro como un campo General. El subtipo 1 pasa al Visual FoxPro como un campo Memo.
¿Cómo se hace para guardar fotografías en la Base de Datos y mostrarlas después?
NOTA: Esto es específico para el lenguaje Visual FoxPro, en otros lenguajes debería ser similar:
Para guardar una fotografía:
lnIdenti = 12345 && Identificador del alumno lcFotografia = "C:\MISFOTOS\FOTO1.JPG" && Fotografía del alumno lcFotografia = FileToStr(lcFotografia) && Fotografía convertida a texto lcComando = "UPDATE ALUMNOS SET ALU_FOTOGR = ?lcFotografia WHERE ALU_IDENTI = ?lnIdenti" lnResultado = SQLExec(gnHandle, lcComando) IF lnResultado > 0 =MESSAGEBOX("Fotografía grabada exitosamente") ELSE =MESSAGEBOX("No se pudo grabar la fotografía") ENDIF
En este ejemplo, se intentó grabar la fotografía FOTO1.JPG que corresponde al alumno cuyo Identificador es 12345. Luego, se muestra un mensaje según que la grabación haya tenido éxito o no.
Para mostrar una fotografía, forma simple:
lnIdenti = 12345 lcConsulta = "SELECT ALU_FOTOGR FROM ALUMNOS WHERE ALU_IDENTI = ?lnIdenti" llConsultaOK = SQLExec(gnHandle, lcConsulta) COPY MEMO ALU_FOTOGR TO CurDir() + "TEMP.JPG" THISFORM.Image1.Picture = CurDir() + "TEMP.JPG"
Aquí, la columna ALU_FOTOGR de la tabla ALUMNOS del Firebird pasó al Visual FoxPro como un campo memo. Ese campo memo es entonces copiado al disco duro C: con un nombre de archivo (puede ser cualquier nombre) y la extensión .JPG (la extensión debe ser la misma que fue usada cuando se guardó la fotografía, el nombre del archivo puede ser cualquiera). Después, simplemente se mostró en el formulario el archivo que tiene la extensión .JPG
Para mostrar una fotografía, forma más profesional:
Aunque la forma simple puede funcionar, a veces ocurren errores (por ejemplo, el alumno aún no tiene una fotografía) que deben ser detectados antes de mostrarla.
lnIdenti = 12345 lcConsulta = "SELECT ALU_FOTOGR FROM ALUMNOS WHERE ALU_IDENTI = ?lnIdenti" lnResultado = SQLExec(gnHandle, lcConsulta) IF lnResultado > 0 IF !IsNull(ALU_FOTOGR) CLEAR RESOURCES lnNumVeces = 0 llFotografiaOK = .F. DO WHILE lnNumVeces <= 3 .and. !llFotografiaOK llFotografiaOK = .T. TRY COPY MEMO ALU_FOTOGR TO CurDir() + "TEMP.JPG" ThisForm.Image1.Picture = CurDir() + "TEMP.JPG" CATCH llFotografiaOK = .F. ENDTRY lnNumVeces = lnNumVeces + 1 ENDDO IF !llFotografiaOK =MESSAGEBOX("No se pudo obtener la fotografía de este alumno") ENDIF ELSE =MESSAGEBOX("Este alumno aún no tiene una fotografía") ENDIF ELSE =MESSSAGEBOX("Falló la conexión con la Base de Datos") ENDIF
En este caso primero se verifica si se pudo obtener la columna ALU_FOTOGR ya que la conexión con la Base de Datos pudo haber fallado por algún motivo (cable roto, router descompuesto, etc.). Segundo, se verifica si el alumno tiene una fotografía. Si la columna ALU_FOTOGR es NULL entonces no tiene fotografía. Si tiene una fotografía entonces se trata de copiarla al disco duro y luego mostrarla, se realizan tres intentos porque a veces el primer intento falla, sobre todo si hay problemas en la red. Podrías aumentar la cantidad de veces en que se intenta si tu red suele tener problemas.
Para mostrar la fotografía sin previamente guardarla en el disco duro:
También tienes la posibilidad de mostrar la fotografía sin guardarla en el disco duro. O sea que en lugar de escribir:
COPY MEMO ALU_FOTOGR TO CurDir() + "TEMP.JPG" ThisForm.Image1.Picture = CurDir() + "TEMP.JPG"
Puedes simplemente escribir:
ThisForm.Image1.PictureVal = ALU_FOTOGR
De esta forma no se guardarán en el disco duro las fotografías que los usuarios miran, algo que a veces puede ser útil y a veces no.
¿Son éstos los únicos métodos para obtener y mostrar las fotografías con Visual FoxPro?
No, hay varios otros métodos, pero los mostrados funcionan muy bien siempre y son muy rápidos. Y el último es a prueba de errores.
Conclusión:
Si usas Firebird lo conveniente es que guardes las fotografías (y cualquier otro contenido multimedia) dentro de la Base de Datos, porque al hacer así te aseguras que estén siempre a tu disposición y además disminuyes la probabilidad de vandalismo y si tal cosa llegara a ocurrir podrías muy fácilmente detectar al culpable.
Para guardar fotografías debes usar columnas de tipo BLOB, tanto las de subtipo 0 como las de subtipo 1 te servirán. El Firebird no guarda a las columnas de tipo BLOB en la tabla donde fueron declaradas esas columnas sino en otras páginas de la Base de Datos; en las columnas de tipo BLOB lo que se guarda es un puntero, una referencia, al lugar dentro de la Base de Datos en donde se encuentra el contenido.
Artículo relacionado:
cerezocableado
May 20, 2013 @ 14:10:34
Buenas tardes,
Para mi, el principal punto es que están accesibles, cuando conectas a una BD accedes por su IP a través de Firebird, no es necesario tener acceso físico al fichero de BD desde la aplicación cliente, mas bien esta claramente desaconsejado, en este caso, ¿donde poner las fotos para que cualquier cliente pueda acceder a ellas? la respuesta lógica es, en la propia BD.
wrov
May 20, 2013 @ 14:18:29
Buen punto, actualizaré ahora el artículo con tu comentario.
Saludos.
Walter.
Francisco
May 21, 2013 @ 15:03:56
Aprobechando este punto, si el problema de seguridad es no compartir una carpeta en el servidor, como se hará para compartir los reportes,?
Normalemnte lo que hago es poner todo en el servidor y en las terminales el ejecutable de la aplicación, y bien los FRX quedan tambien en el servidor, dentro de la carpeta de la aplicación, como ejecutar estos FRX sin compartir la carpeta en el servidor ?.
No creo que sería conveniente instalar en cada terminal los FRX y dspues que haya alguna modificacion en alguno de ellos tener que actualizar a cada equipo.
Como lo resuelven ustedes ?
wrov
May 21, 2013 @ 15:28:21
Francisco, a veces hay que usar carpetas compartidas, es inevitable, pero hay que tratar de usarlas lo mínimo posible.
En mi caso, para actualizar automáticamente las aplicaciones creé un programa al que llamé LOADER.EXE que es el encargado de cargar los .EXE que utilizan los usuarios. Lo que hace LOADER.EXE es lo siguiente:
– Verifica si el usuario tiene permiso para descargar una versión más nueva de la aplicación (por ejemplo, de SQL_CONTA.EXE)
– Si tiene permiso entonces:
. Verifica si la versión que está en el Servidor de Internet es más nueva que la versión que está en el Servidor local
Si la versión de Internet es más nueva, entonces:
+ Descarga desde el Servidor de Internet la aplicación y la guarda en una carpeta compartida del Servidor local
Verifica si la versión que está en el Servidor local es más nueva que la versión que está en la computadora del usuario
+ Si la versión que está en el Servidor local es más nueva, entonces la copia a la computadora del usuario
– Ejecuta la aplicación (por ejemplo, SQL_CONTA.EXE)
De esta manera me aseguro que siempre cuando un usuario ejecuta la aplicación tenga la versión más nueva.
Saludos.
Walter.
Francisco
May 21, 2013 @ 20:25:37
Estoy de acuerdo contigo referente al «lanzador» de la aplicación y que se actualice automáticamente asi lo manejo tambíen en algunas aplicaciones.
Mas bien mi comentario iba por lo de compartir las carpetas, y veo que si es necesario, la ventaja grande, te pueden eliminar tal vez reportes pero la información si que la puedes ocultar mas que con las DBF’s usando FB.
saludos.
cerezocableado
May 22, 2013 @ 08:39:41
Yo prefiero el método de compartir la carpeta con el ejecutable, si copias fbclient.dll a la carpeta, los clientes pueden acceder sin necesidad de instalar firebird.
La desventaja es que para actualizar tienes que desconectar a todos de la aplicación.
En cuanto a los informes, no conozco los FRX que comentáis, pero os propongo una solución, guardarlos en la propia BD y pasarlos a una carpeta temporal para su ejecución, de este modo siempre se usa la ultima versión del informe y esta todo organizado y protegido.
wrov
May 22, 2013 @ 11:47:25
Bueno, en mi caso pedirles a todos que salgan de la aplicación porque voy a cambiar algo en ella es totalmente impracticable, algunos de mis clientes tienen decenas de usuarios concurrentes y el mes pasado una aplicación mía la usaron más de 7.500 personas al mismo tiempo, al 99,9% de las cuales ni siquiera conozco.
Pero la idea de guardar los informes dentro de la Base de Datos y extraerlos de ahí antes de utilizarlos es muy buena, evitaría usar carpetas compartidas y todos tendrían siempre la última versión.
Inclusive, para no mezclar las cosas podrías tener 2 bases de datos: una para los datos que ingresan los usuarios y otra para los módulos de tu aplicación (rutinas, informes, DLLs, autorizaciones, etc.) y si en alguna de sus tablas guardas la versión de tu aplicación con solo conectarte a esa Base de Datos ya podrías saber cual versión tiene instalada tu cliente. Interesante.
Saludos.
Walter.
Antonio Meza
Jul 30, 2013 @ 15:38:15
En el caso de Visual Fox Pro, como se hace para conectarse a firebird usando como comentas la librería fbclient.dll copiandola en la carpeta donde esta el programa, ya que en mi caso instalo el ODBC de Firebird en el equipo del usuario para poder conectarme?
saludos
wrov
Jul 30, 2013 @ 15:47:57
Antonio, son dos cosas distintas:
El Cliente del Firebird que debes instalar en cada computadora de los usuarios es fbclient.dll
Ese .dll se encargará de las conversaciones con el Servidor.
Por otro lado el driver ODBC (o cualquier otro driver que decidas utilizar) tiene por tarea que el Servidor y el Cliente cuenten con un canal de comunicación mediante el cual puedan entablar una conversación.
O sea que en cada computadora deberás instalar el Cliente del Firebird (el archivo fbclient.dll) y el driver de comunicación (por ejemplo el ODBC).
Si te falta alguno de ellos, el Servidor y el Cliente no podrán comunicarse entre sí.
Saludos.
Walter.
Antonio Meza
Jul 30, 2013 @ 16:27:10
Muchas gracias Walter por la explicación, la verdad estaba confundido en este tema.
wrov
Jul 30, 2013 @ 23:22:54
De nada.
Recuerda que en una computadora debes instalar el Servidor y el driver ODBC (o cualquier otro driver que desees utilizar). Y en todas las demás computadoras el Cliente y el driver ODBC (o cualquier otro…)
El Cliente hace los pedidos al Servidor y recibe los resultados de sus pedidos.
El Servidor procesa los pedidos que realizó el Cliente y le devuelve los resultados.
El driver ODBC (o cualquier otro…) sirve para que el Cliente y el Servidor puedan comunicarse entre sí.
Saludos.
Walter.
Francisco
May 23, 2013 @ 16:42:24
muy interesante la propuesta de trabajar asi. saludos.
El índice del blog Firebird21 | Firebird SQL
Jun 17, 2013 @ 04:44:17
Arturo Ramos / Cancún, México
Ago 18, 2013 @ 00:11:12
Hola Walter,
Sigo tu código para guardar la foto en la base de datos desde VFP pero lo que se guarda es tal cual la ruta a la foto, esto es lo que debe pasar ?, entendí que era lo que se quería evitar.
Saludos.
wrov
Ago 18, 2013 @ 00:59:49
Lo que debes guardar es la fotografía, no la ruta y el nombre de la fotografía.
¿Tu columna es de tipo BLOB y subtipo 1?
Saludos.
Walter.
Arturo Ramos / Cancún, México
Ago 18, 2013 @ 02:22:11
Si, entiendo que se debe guardar el archivo pero cómo…
Si es BLOB:
…
PRINCIPAL BLOB SUB_TYPE 1 SEGMENT SIZE 80,
…
Usando tu código de este tema sólo se guarda la ruta:
lcComando = «UPDATE ALUMNOS SET ALU_FOTOGR = ?lcFotografia WHERE ALU_IDENTI = ?lnIdenti»
Saludos y gracias por tu tiempo.
wrov
Ago 18, 2013 @ 03:54:33
Algo estás haciendo mal porque siempre se guarda la fotografía, no la ruta. Vuelve a revisar todo lo que escribiste.
Saludos.
Walter.
Arturo Ramos / Cancún, México
Ago 19, 2013 @ 14:22:18
Hola gracias por tu tiempo,
Sólo copie y pegue tu código, no será que se tienen que hacer alguna transformación del archivo y guardarlo en alguna variable, por que en tu código guardas la ruta al archivo en la variable lcFotografia y al hacer el UPDATE pues es la tura la que se guarda, no me explico como el SQLExec() o el ODBC transforma esa ruta en el archivo a guardar.
Saludos.
Arturo Ramos / Cancún, México
Ago 19, 2013 @ 14:43:34
Hola Walter,
Me puse a buscar y creo esto es lo que falta en tu código:
cPict = FILETOSTR( lcFotografia )
cPict es lo que se debe guardar en la base en el campo BLOB.
De esta forma si funciona.
Comenta…
wrov
Ago 20, 2013 @ 14:28:31
Tienes razón Arturo, faltaba la función FileToStr(), es extraño porque en mi código la tenía, seguramente el duende del blog la borró 🙂
Ya está actualizado.
Saludos.
Walter.
Arturo Ramos / Cancún, México
Ago 20, 2013 @ 20:38:10
Jaja, bien,
Sólo un aporte adicional para los que manejan VFP 9, pueden usar la propiedad PictureVal del objeto de imagen para mostrar la foto directo del campo memo (blob de FB) sin tener que guardarla en el disco como archivo.
lnIdenti = 12345
lcConsulta = «SELECT ALU_FOTOGR FROM ALUMNOS WHERE ALU_IDENTI = ?lnIdenti»
llConsultaOK = SQLExec(gnHandle, lcConsulta)
THISFORM.Image1.PictureVal = ALU_FOTOGR
Saludos.
wrov
Ago 20, 2013 @ 20:52:47
Buen punto Arturo, actualizaré el artículo con tu aporte.
Saludos.
Walter.
Diana Aguilar
Jul 28, 2014 @ 17:18:19
Hola soy nueva en este lugar.
Yo trabajo visual foxpro 9.0 con mysql.
pero veo que hablan de actualizaciones en line y todo eso.
quien me podia ayudar con eso.
Otra cosa. quien sabe que dll debo instalar en las terminales que corran la aplicacion para que funcione esto. ThisForm.Container4.IMGfoto.pictureval=CAST(Estudiantes.foto as BLOB)
En mi equipo donde tengo instalado el vfp corre perfecto pero en la otras terminales no muestar la imagen.
ejgtuc
Abr 30, 2015 @ 17:37:40
Walter, grabo y recupero fotos desde FireBird con VisualFox9, todo bien, en una LAN la velocidad es muy buena. Cuando recupero el campo que tiene el archivo de la foto via web desde una base que tengo instalada en otra ciudad la demora es de 18 segundos para una archivo JPG de 768KB, como no tengo parametros para comprar te consulto si es mucho tiempo o es normal para el tamaño?. Gracias
wrov
Abr 30, 2015 @ 17:56:31
¿Y cuánto tiempo se demora cuando descargás el archivo por otros métodos? Por ejemplo por e-mail o por FTP.
18 segundos me parece mucho, pero depende de la velocidad de tu conexión.
Saludos.
Walter.
ejgtuc
Abr 30, 2015 @ 18:08:13
usando teamviewer en transferencia de archivos 14 seg.
wrov
Abr 30, 2015 @ 18:11:20
Bueno, entonces no hay mucha diferencia, está dentro de lo razonable.
Saludos.
Walter.
ejgtuc
Abr 30, 2015 @ 18:16:26
Ok, gracias Walter.
jtraslavi
Mar 03, 2016 @ 21:44:05
Hola Walter, respecto al tema del artículo, quizá me pueda ayudar con un inconveniente y es el siguiente..
Tengo definida una tabla así… (la idea es guardar allí unas imágenes en formato texto – base 64)
CREATE TABLE CAN_GRAFICAS (
CANREF NUMSMA,
GRAREF NUMSMA,
GRADAT BLOB SUB_TYPE 1 CHARACTER SET UTF8);
cuando intento ejecutar
INSERT INTO CAN_ARCHIVOS_GRA VALUES (3,3,’9j4AAy … ttttttk’)
si lo ejecuto desde php me devuelve el error «SQLSTATE[01004]: String data, right truncated»
si lo ejecuto desde el IDE saca el error
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Unexpected end of command – line 1, column 42.
Tiene de particular que cuando el tamaño de la cadena ‘9j4AAy … ttttttk’ es menor a 64k permite la ejecución normalmente tanto desde php como desde el IDE.
Por otra parte cuando actualizo el campo directamente en la tabla con un copy – page lo permite hacer sin problema sin importar el tamaño de la cadena incluida en el campo blob
Le agradezco si me pudiera dar luces de que modificar o configurar, ya he mirado documentación y no tengo idea donde se limita el largo de ese string..
La versión que utilizo es Firebird Database Server 2.5.2.26540 instalado sobre un Win 7 / 32
El IDE que utilizo es SQL Manager 2008
De antemano gracias por su ayuda …
Saludos
wrov
Mar 04, 2016 @ 15:53:52
Prueba quitando el CHARACTER SET.
Saludos.
Walter.
jtraslavi
Mar 03, 2016 @ 21:45:59
Disculpe Walter confundi el nombre del archivo pero en realidad no es relevante …
jtraslavi
Mar 04, 2016 @ 17:27:02
Probé así
CREATE TABLE CAN_ARCHIVOS_GRA (
CANREF NUMSMA,
GRAREF NUMSMA,
GRADAT BLOB SUB_TYPE 1 CHARACTER SET NONE);
y no hubo ningún cambio, que otra cosa podría probar ?.
Gracias Saludos
jtraslavi
Mar 04, 2016 @ 18:28:33
Como nota adicional hice
CREATE DATABASE ‘127.0.0.1/gds_db:E:\BASES\TEMPO.FDB.GDB’ USER ‘SYSDBA’
PAGE_SIZE 4096
DEFAULT CHARACTER SET NONE;
CREATE TABLE TEMPO (
GRACON SMALLINT NOT NULL,
GRADAT BLOB SUB_TYPE 1 CHARACTER SET NONE);
igualmente hice las pruebas con el IDE Flame Robin
y el problema persiste. Esto lo hice para probar si era problema de la base en particular o del gestor.
Saludos, le agradezco las luces que me pueda dar.
Víctor
Mar 14, 2016 @ 22:10:19
Que tal, saludos….
Sería más recomendable guardar las fotos en una base de datos diferente ? De esa manera tendríamos una base de datos con solo datos y otra base de datos con las fotos. Les parece una buena idea ?
wrov
Mar 16, 2016 @ 23:53:38
Es una alternativa y hay gente que hace así. Funciona.
A mí no me gusta porque en Firebird hasta ahora no se pueden relacionar tablas de 2 bases de datos diferentes y siempre prefiero que las tablas estén relacionadas.
Otras alternativas son:
– En la misma tabla principal guardar las fotografías. Por ejemplo, si la tabla se llama EMPLEADOS tener una columna EMP_FOTOGR para guardar las fotografías de los empleados en esa columna.
– Tener una tabla exclusiva para las fotografías de su tabla relacionada. Por ejemplo, la tabla principal se llama EMPLEADOS y la tabla relacionada se llama EMPLEADOSFOT. Esta es la alternativa que yo utilizo.
Saludos.
Walter.
Edgar
Abr 20, 2016 @ 16:59:16
Buenas tardes, saludos,tengo un problema, necesito extraer las imágenes con su respectivo id de la base de datos del servidor y posteriormente importarla en la base de datos del cliente,cabe a clarar que son muchos clientes, como puedo hacerlo, ya que hasta hoy no he podido, y si es posible realizarlo con un insert into, porque investigando he encontrado que no es posible. Le agradecería mucho su apoyo.
Edgar Elioenai Arias Candelero
Abr 20, 2016 @ 17:03:00
Hola buenas tardes, saludos, tengo un problema, necesito extraer las imágenes con su respectivo id de la base de datos del servidor y posteriormente importarla en la base de datos del cliente,cabe a clarar que son muchos clientes, como puedo hacerlo, ya que hasta hoy no he podido, y si es posible realizarlo con un insert into, porque investigando he encontrado que no es posible. Le agradecería mucho su apoyo.
wrov
Abr 22, 2016 @ 00:44:27
¿Base de Datos del Servidor? ¿Base de Datos del Cliente?
O yo no estoy entendiendo o tú tienes un error de concepto o te estás expresando mal.
La Base de Datos es una sola, el Cliente solicita algo al Servidor y el Servidor verifica que la solicitud sea correcta sintácticamente y de ser así la procesa y devuelve el resultado de ese procesamiento al Cliente.
No es que el Servidor usa una Base de Datos y el Cliente usa otra Base de Datos. En Firebird al menos no es así.
Quizás si te expresas mejor y con algún ejemplo se pueda entender lo que quieres conseguir y ayudarte.
Saludos.
Walter.
pedrocerezo
Abr 22, 2016 @ 04:26:37
Hola Edgar,
Si quieres extraer información de una tabla y llevar a otra tabla de otra base de datos, tienes dos opciones, si están en la misma red, usa un procedimiento almacenado para acceder a la bd origen con:
EXECUTE STATEMENT sql-statement
ON EXTERNAL [DATA SOURCE]
[AS USER user]
[PASSWORD password]
[ROLE role]
[…other options…]
[INTO ]
o bien si no tienes acceso directo y tienes que llevarte los datos de una localización a otra, prueba con http://fbexport.sourceforge.net/ que te permite extraer datos a un fichero especial y luego volver a cargarlos
Saludos
aice91
Abr 28, 2016 @ 12:02:34
Hola Walter, Me explicare mas a fondo, si son base de datos distintas, tengo una base de datos aquí en mi oficina que es la que esta en el servidor, tengo clientes en red que en este caso, si es la misma BD, pero de igual forma en mi negocio tengo sucursales que la base de datos son independientes no están en red y no tienen conexión con mi BD, lo que quiero es exportar de mi base de datos imágenes, que por cierto son miles, junto con su id e importarlo en la base de datos de mi sucursal. Disculpe por no especificar que son dos bases de datos independientes la una de la otra. También necesito saber si es posible insertar en una tabla datos que incluyan archivos blob’s en mi caso imagenes con INSERT INTO.
Gracias pedrocereso probar`´e con fbExport
obonet
May 21, 2016 @ 23:57:51
Hola buenas noches aunque sea muy tarde la publicación desde la fecha de emsión, tengo este caso: mi aplicación utiliza visual foxpro y la función FileToStr() ahora tengo la necesidad de un desarrollo alterno en PHP como utilizaría para subir y descargar esas imágenes que se subieron en vfox con esa función? y si es registrada en php como se descarga en vfoxpro? con la misma función?
obont
May 23, 2016 @ 23:19:21
perdónenme si meto algo de otro hilo: si en firebird existe tipo de datos el blob en SQL-SERVER cual debe ser? image? o text ? cual de los dos debo utilizar?
Es que tengo el caso mixto, donde me encuentro con Firebird una parte del desarrollo, hasta aqui ok, en otro desarrollo me piden trabajarlo en el SQL-Server. En ambos desarrollos utilizo visual FoxPro 9.
Que tipo de campo debo usar para sql-server? alguien con experiencia?
Luis Gerardo Carrillo
Mar 07, 2017 @ 14:11:14
Buenos dias Walter, estoy haciendo una aplicacion y va a utilizar muchas fotografias y lo que estoy temiendo es que llegue el punto en que sea demasiado lento leerlas.
Cada fotografia pesa entre 4 y 5 Mb, conoces alguna funcion o hay algo que me ayude a reducir el tamaño de la fotografia antes de guardarla en la Base de datos.
ejgtuc
Mar 07, 2017 @ 14:23:25
Me sumo a la consulta.
wrov
Mar 07, 2017 @ 22:25:13
Hola
Hay muchos programas que te permiten reducir el tamaño de las fotografías, muchos se usan en línea y son gratuitos. Si las fotografías se verán en la computadora, una resolución de 1 Megapixel o de 2 Megapixeles, es más que suficiente. Mucha gente cree que si fotografían con 10 megapixeles (por ejemplo) la fotografía saldrá más nítida que si fotografían con 2 megapixeles. Eso es falso.
Y además, es muy fácil comprobar que es falso. Con tu celular o una cámara digital prueba a tomar fotografías del mismo objeto pero con distintas resoluciones y mira luego esas fotografías en tu computadora. No encontrarás ninguna diferencia, salvo que el tamaño de la fotografía es mayor cuando mayor es la resolución. Pero, aquí está lo importante: si verás esas fotografías en tu computadora, en un marco de digamos 1024 x 768 pixeles, que la fotografía haya sido tomada con 2 megapixeles, con 5 megapixeles, o con 16 megapixeles, no importará. Todas se verán idénticas.
Entonces, lo que debes hacer es tomar SIEMPRE las fotografías con la menor resolución que necesitas. Si por ejemplo, esas fotografías las verás en un recuadro de 640 x 480, entonces una resolución VGA, o como máximo una resolución de 1 megapixel ya cumplirá su objetivo y además ocupará muy poco espacio en el disco. Normalmente, esas fotografías pesan alrededor de 80 Kb, un poco más o un poco menos, pero por ahí cerca.
Tomar fotografías con muchos megapixeles solamente se justifica si esas fotografías se imprimirán en papel fotográfico de gran tamaño. Los muchos megapixeles, no sirven para nada si las fotografías se verán en el monitor de una computadora (salvo que ese monitor sea gigantesco, claro).
Por lo tanto, además de usar programas para reducir el tamaño de las fotografías ya tomadas, para las nuevas fotografías debes pedir que se use una resolución de 1 megapixel, o de 2 megapixeles como máximo, dependiendo de la resolución de tu monitor. Prueba con una resolución de 1 megapixel y con una resolución de 2 megapixeles, y luego decide cual usar.
Fíjate que una fotografía de 2 megapixeles ocupa mucho más espacio en el disco duro que una fotografía de 1 megapixel. Así, salvo que sea realmente necesario tomarlas con 2 megapixeles, las fotografías deben tomarse con 1 megapixel.
Ahora, respecto al almacenamiento de esas fotografías. Lo más conveniente es no guardarlas en la misma tabla que el ítem que representas. Por ejemplo, si vas a guardar las fotografías de los alumnos, deberías tener una tabla ALUMNOS y otra tabla ALUMNOSFOT, en la primera guardarías los nombres, apellidos, y otros datos de los alumnos, en la segunda guardarías sus fotografías.
¿Por qué eso?
Para que un SELECT * FROM ALUMNOS no te esté cargando las fotografías, lo cual hará que la consulta sea extremadamente lenta. Si necesitas ver la fotografía de un alumno entonces haces un JOIN a la tabla ALUMNOSFOT y así lo solucionas.
Saludos.
Walter.
Luis Gerardo Carrillo
Mar 09, 2017 @ 13:01:47
Gracias por la informacion, ya hice pruebas como bien lo dices, la imagen no pierde nada si le bajas la resolucion y se cargan bastante rapido, sin embargo creo que no plantee bien la pregunta
¿Habra en VFP o alguna rutina, algoritmo, OCX, DLL, etc que me ayude a reducir el tamaño de una imagen en tiempo de ejecucion?
Gracias
wrov
Mar 09, 2017 @ 13:18:52
No conozco ninguna rutina, clase, OCX, o DLL que te permita reducir el tamaño de las fotografías en tiempo de ejecución, pero es probable que exista, aunque lo normal es hacerlo previamente. Muchos programas de diseño fotográfico tienen esa opción, algunos inclusive pueden ser ejecutados on-line y son gratis.
Saludos.
Walter.
Linx Cerberus
Jul 02, 2017 @ 16:39:13
HOLA, SOY NUEVO EN ESTO DE FIREBIRD Y EN GENERAL EN BASE DE DATOS MI PROBLEMA ES SIMPLE SUPONGO , LES EXPLICO SOLO QUIERO INSERTAR UNA IMAGEN DESDE CONSOLA ESTOY TRABAJANDO EN FIREBIRD 2.5 CON DEBIAN Y NO SE COMO HACER LA INSERCIÓN MI TABLA ES IMAGEN
CREATE TABLE IMAGEN (
IMAGEN BLOB SUB_TYPE 0);
TENGO LA IMAGEN PNG EN LA CARPETA DE DESCARGA
/HOME/USER/DOWLOAD/EJEMPLO.PNG COMO HAGO AL INSERCIÓN A MI TABLA DESDE CONSOLA POR FAVOR AYUDA 🙂
wrov
Jul 04, 2017 @ 02:59:46
Para guardar una imagen, vídeo, audio, planilla Excel, etc., tienes dos opciones:
1. Guardas la ruta completa
2. Guardas el objeto
Ambas opciones tienen sus ventajas y sus desventajas que están explicadas en otros artículos de este blog.
Pero una cosa es guardar la ruta al objeto o el objeto, y otra cosa muy distinta es mostrarlo al usuario. Esto último lo debes hacer siempre con tu lenguaje de programación. Ni Firebird ni algún otro motor SQL te mostrarán el objeto en el monitor de tu computadora.
Guardar el objeto en una tabla es muy simple. Lo guardas como guardarías a cualquier otro dato. Si sabes como guardar un número entero, una fecha, un texto, etc. entonces también sabes como guardar una imagen.
Saludos.
Walter.
alejandro
Nov 10, 2017 @ 21:43:23
Hola, existe algun gestor o ejecutable que me ayude a conectarme a mi base de datos y de manera masiva subir mis fotos? Muchas gracias.
wrov
Nov 12, 2017 @ 04:39:13
No que yo sepa, pero sería muy fácil hacer ese programa.
Saludos.
Walter.
Ricardo
Nov 16, 2017 @ 20:10:57
Yo prefiero mantener las fotografías fuera de la base de datos. Principalmente por el tamaño de las copias de seguridad. Una base de datos con 60000 articulos y tres o cuatro fotos por articulo de unos 4 MB puede ocupar unos 960000 MB. Se dedican demasiados recursos a realizar la copia de seguridad. Si las imagenes están fuera de la BD se hace una unica copia de ellas y se añaden las nuevas y ahorras una enorme cantidad de tiempo y ancho de banda.
Además, no supone ningun riesgo de seguridad tener una carpeta compartida para todo el mundo con derechos limitados a lectura. Si en el futuro se cambia la base de datos de servidor y la ruta del fichero cambia tampoco es problema porque lo normal es escribir el nombre de la imagen en un campo de la tabla y la ruta en un unico registro de configuracion o en varios, dependiendo de las necesidades, permitiendo tener un servidor de ficheros para las fotos y otro para la base de datos mejorando el rendimiento de esta ultima.
ejgtuc
Sep 13, 2022 @ 17:25:37
Cree dos clases visuales una contenedor con una imagen y otra basada en imagen directamente y no me muestra la imagen, cuando lo hago en el form con un control imagen como venia haciendo todo bien. les paso ?