Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Alternativa para almacenar imagenes de la BD (https://www.clubdelphi.com/foros/showthread.php?t=76832)

erikmx 30-11-2011 00:01:21

Alternativa para almacenar imagenes de la BD
 
Saludos a todos, hace poco hice una base de datos parecido a una agenda, pero incluia la foto, y se me hizo facil crear un campo BLOB para almacenar las fotos, y podriamos decir que todo hiba muy bien, las imagenes no rebasan los 500x500px o en tamaño los 200kb

Pero ahora que tengo como 500 contactos el problema es que se tarda mucho en cargarse la base de datos incluso a veces se bloquea, quisiera saber que me recomiendan, igual y crear otra tabla para las puras fotos o subirlas aparte a una carpeta del servidor, como cuando se hace en PHP ( del cual lo basico basico apenas lo conozco ) y despues se lee la ruta almacenada en un campo "Text"

Se aceptan sugerencias :D de preferencia la mas facil que duele menos :D

Casimiro Notevi 30-11-2011 09:11:02

Si sale error es porque tienes algún error.
Deberías enseñarnos el código que usas para guardarlas y para leerlas y presentarlas, para poder ayudarte.
Ten en cuenta que esas 500 fotos no es nada, ahora mismo tengo aquí la BD de un cliente y tiene más de 3 millones de fotos de artículos, y no tiene ningún problema por ello.

erikmx 30-11-2011 18:33:14

Buen Dia
 
Hola Casimiro Notevi

Gracias por tu respuesta, mir estoy probando los componentes UniDAC para conectar con MySQL,

Utilizo el componente de Conexion MySQL un TUnitDataSource que es la Alternativa para un DataSource, y un TUniTable para sustituir Al Componente Table

Solo coloco la direccion del servidor el usuario y contraseña para la base de datos y enlazo los componentes a la Tabla con la Agenda, Y utilizo los componentes DBEdit enlazados a los campos realmente nada fuera de lo normal y una DBGrid

Para abrir la tabla en el FormShow;

Código Delphi [-]
TUnitable.Open;

Y en el FormClose;

Código Delphi [-]
TUnitable.Close;

La base de datos la hice con un gestor de MySQL y asi carge las imagenes, realmente no me presenta ningun error cargar los datos y las imagenes en un TImage

Lo que pasa es que se tarda en cargar como 3 minutos la tabla, por lo que veo carga todos los datos de la base y despues los muestra.

Habra alguna forma de limitar el numero de regustros a cargar o tengo que cambiar al componente de TUniQuery?

AzidRain 30-11-2011 22:42:56

El error es de diseño no de programación, a menos que sea una tabla muy pequeña casi nunca se debe hacer un "select * from nombre_tabla" sin restringir ni filtrar nada ya que te puede pasar lo que te está sucediendo. A Casimiro le pasaría exactamente lo mismo si pretendiera cargar los 3 millones de registros de su tabla.

Lo que puedes hacer es restringir el num de registros que vas a traer en cada consulta ya sea mediante filtros que pidas al usuario (de tal a tal fecha, de tal a tal numero) o bien paginando mediante un LIMIT

ejemplo, pensando en que vamos a paginar de 50 en 50 registros:

Código SQL [-]
select * from mitabla LIMIT 50
te trae los primeros 50 registros

Código SQL [-]
select * from mitabla LIMIT 50 OFFSET 50
te trae los siguientes 50 registros y así sucesivamente siempre vamos cambiando el valor de offset de 50 en 50.

Ojala pusieras el query que estas utilizando

erikmx 01-12-2011 05:04:00

AzidRain muchas gracias por tu sugerencia, pues si tienes razon estuve probando varias cosas y decidi cambiar a la UniQuery

Al principio me costo un poco de trabajo encontrar como relacionar entre los objetos de la form pero por fin lo logre

y para evitar que me pasara lo mismo que con la UniTable

Cambie el codigo de carga inicial

Código SQL [-]
Select * From MainDB

Por

Código SQL [-]
SELECT *
FROM MainDB
WHERE
MainDB.NOMBRE LIKE '% %' AND
MainDB.APELLIDOPATERNO LIKE '% %' AND
MainDB.APELLIDOMATERNO LIKE '% %' 
ORDER BY
MainDB.NOMBRE ASC,
MainDB.APELLIDOPATERNO ASC,
MainDB.APELLIDOMATERNO ASC

Para que me aparezca un registro en blanco y con eso el tiempo de carga de 4 minutos se redujo a unos cuantos segundos :D

Ahorita me estoy familiarizando con cargar solo el registro que necesito y poder actualizarlo... ahi la llevo :D

Pero ahora que me sugeriste cargar por lotes de 50 me parece mucho mejor

Solo que como le indico al componente o la Grid que cuando llegue al final de los 50 y quiero ver los siguientes 50 me los muestre o regresar a los anteriores 50, se agradece la ayuda :D

AzidRain 01-12-2011 18:28:57

Recuerda que la grid solo es un componente visual, no tiene control real sobre los datos. El valor de 50 es solo un ejemplo, tu puedes experimentar y traer los que te resulten mas rápidos. Para hacer que funcione lo de la paginacion tienes que implementar algunas rutinas que lleven la cuenta de en que pagina estas para lanzar el query de acuerdo con los registros que necesites traer. En el el ejemplo que te puse tienes el primer query que lanzarías (digamos "la página 1") y el otro query te trae las páginas que siguen, de manera que puedes guardar en una variable en que página estas para saber que valor ponerle al offset que siempre será el valor de la página multiplicado por el número de registros por pagina

Código Delphi [-]
var pagina: integer;
     registros_por_pagina: integer;

Begin
  pagina := 1;
  registros_por_pagina:=50;
  offset_query := pagina * registros_por_pagina;
    
 //  Abrimos el primer query que seria el que te puse en el otro ejemplo

  
end;

Ya nada pones 2 botones "pagina anterior" y "página siguiente" y segun el caso incrementas o decrementas el valor de la variable página y recalculas el offset del query, lanzando la segunda query que te puse.

erikmx 02-12-2011 00:09:05

Muchas Gracias
 
Muchas Gracias Azid, lo voy a probar

Por cierto estaba pensando cargar solo los registros por la fecha actual, voy a intentarlo y haber que sale porque se me ocurren 2 formas en la query meter una variable que se asigne al DateToStr(DATE) para que lo lea la query

O checar si hay alguna funcion en MySQL que lo pueda hacer :D solo que aqui no estoy en la maquina que tengo delphi :rolleyes:

Ahora como el sistemita se supone que almacenara funcionara para varias personas que tendran su propia agenda, mi intencion ( claro tengo que pensar bien si poner una tabla por usuario o una sola con el nombre del usuario en cada registro para diferenciarlos ) es que pueda yo realizar una consulta para los registros de los X usuarios y me diga si un mismo telefono o conocido tienen en comun

Algo asi como lo que hacen algunas redes sociales que te dicen que quizas conoscas a esa persona, claro que con las agendas de pocos usuarios que van a trabajar con el sistemita pero cada uno tendra su agenda con conocidos o clientes y es para saber a quienes conocen en comun :D

Pero por mientras pues a darle a lo basico :D


La franja horaria es GMT +2. Ahora son las 16:42:41.

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