Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-06-2014
pjmedina pjmedina is offline
Miembro
 
Registrado: abr 2006
Posts: 84
Poder: 19
pjmedina Va por buen camino
Question ¿Cómo calcular el tamaño de datos importados?

Buenas a todos,

a ver si alguien me puede echar una mano.

Tengo una aplicacion que hace traspasos entre dos bases de datos de firebird que son similares. Estoy usando los componentes TIBSql para hacer la lectura "SELECT" de la base de datos Origen y para la escritura en la base de datos destisno "INSERT".
Estoy utilizando también Delphi XE5, pero me da igual si es para otra versión de delphi.

Quería saber como podría obtener el tamaño en bytes de los datos leidos en la consulta, sin lanzar una consulta adicional.


Explico un poco el ejemplo que hay acontinuacion:
- QMostrar: es un TIBSQL con un select a una tabla en la base de datos origen.
- QInserta: es un TIBSQL con un insert a una tabla en la base de datos destino.
- lselcampos: Es una lista con los titulos de las columnas del select. En el select y en el insert se llamaran igual.

Qmostrar podría ser:
Código SQL [-]
Select CODIGO, NOMBRE, PRECIO, IMAGEN_BLOB from articulo order by codigo asc
QInserta :
Código SQL [-]
insert into articulo (CODIGO, NOMBRE, PRECIO, IMAGEN_BLOB) values (:CODIGO,:NOMBRE,:PRECIO,:IMAGEN_BLOB)
Código:
lselcampos: ['CODIGO', 'NOMBRE', 'PRECIO', 'IMAGEN_BLOB']
Código Delphi [-]
var  ivar:TIBXSQLVar; 
  i:integer; 
begin  
  QMostrar.ExecQuery; 
  while not(QMostrar.Eof) do 
  begin  
    for i:=0 to lselcampos.Count-1 do  
    begin   
      QInserta.ParamByName(lselcampos[i]).Clear;   
      ivar:=QMostrar.FieldByName(lselcampos[i]);   
      if Not(ivar.isNull)then   
      begin    
        QInserta.ParamByName(lselcampos[i]).Assign(ivar);   
      end;  
    end;  
    QInserta.ExecQuery 
  end; 
end;
Espero podais ayudarme. Gracias

Última edición por Casimiro Notevi fecha: 20-06-2014 a las 21:32:24.
Responder Con Cita
  #2  
Antiguo 20-06-2014
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Supongo que con la instrucción FetchAll podrías saber cuantos registros hay. Luego puedes hacer una aproximación, multiplicando este dato por el tamaño de los campos. Obviamente, los Blobs pueden tener cualquier tamaño, por lo que no creo que tenga una solución fácil para este dato.

Código Delphi [-]
with QMostrar do
begin
   ExecQuery;
   FetchAll;
   CantidadRegistros := Count;
   while not EOF do
   begin
      [...]
   end;
end;

Otra interpretación de tu pregunta sería:

Dentro del bucle principal puedes ir acumulando el tamaño de los campos
Código Delphi [-]
with QMostrar do
begin
   ExecQuery;
   CantidadBytes := 0;
   while not EOF do
   begin
       for i:=0 to lselcampos.Count-1 do
       begin 
         CantidadBytes := CantidadBytes + CalculaTamano(lselcampos[i]));
         [...]
   end;
end;

PD: no olvides poner en código entre
[ Delphi ]
...
[ /Delphi ]

Última edición por duilioisola fecha: 20-06-2014 a las 20:28:03.
Responder Con Cita
  #3  
Antiguo 20-06-2014
pjmedina pjmedina is offline
Miembro
 
Registrado: abr 2006
Posts: 84
Poder: 19
pjmedina Va por buen camino
Pero la funcion esa que has puesto que tamaño devolveria, la propiedad size de la fila?

Asi lo habia pensado, pero queria saber los bytes transferidos entre las dos bases de datos.

Gracias por responder
Responder Con Cita
  #4  
Antiguo 20-06-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por pjmedina Ver Mensaje
...
Recuerda poner los tags al código fuente, ejemplo:



Gracias
Responder Con Cita
  #5  
Antiguo 20-06-2014
pjmedina pjmedina is offline
Miembro
 
Registrado: abr 2006
Posts: 84
Poder: 19
pjmedina Va por buen camino
Si los he puesto. No?
Responder Con Cita
  #6  
Antiguo 20-06-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por pjmedina Ver Mensaje
Si los he puesto. No?
No te preocupes, había un error en las etiquetas, ya lo corregí.
Responder Con Cita
  #7  
Antiguo 21-06-2014
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Cita:
Pero la funcion esa que has puesto que tamaño devolveria, la propiedad size de la fila?
En la primera solución:
FetchAll obtiene todos los datos del select.
Count te devuelve la cantidad de registros. Si sabes cuanto ocupa cada registro, podrás calcular la cantidad de bytes con una sola multiplicación.
El problema es que seguramente cada BLOB tendrá un tamaño distinto y no podrás hacer el cálculo. Podrías aproximarlo si todos los BLOBs son de una tamaño parecido.

En la segunda solución:
CaclulaTamano() es una función que debes hacer tu mismo.
En tu código tienes un bucle que recorre los campos, por lo que le enviarías el nombre del campo y te devolvería el tamaño de los datos de ese campo.
Tendría que tener en cuenta el tipo de dato. Si es integer devolvería 4 bytes, si es string devolvería el largo del string, si es BLOB, devolvería el tamaño del contenido, etc.

Cita:
Asi lo habia pensado, pero queria saber los bytes transferidos entre las dos bases de datos.
No mencionas si quieres esa información antes o después de haber transferido los datos.
Si es antes, la respuesta de calcular o aproximar el tamaño es la única que se me ocurre.
Si es después, la segunda opción que te he dado solucionaría tu problema.

Nota: el tamaño siempre sería de los datos. Ten en cuenta que luego hay otros factores que incrementan el tamaño de envío y recepción. En particular el envío de sentencias SQL, codificación de datos, datos de control, etc.

Última edición por duilioisola fecha: 21-06-2014 a las 11:53:00.
Responder Con Cita
  #8  
Antiguo 21-06-2014
pjmedina pjmedina is offline
Miembro
 
Registrado: abr 2006
Posts: 84
Poder: 19
pjmedina Va por buen camino
Wink

Hare la segunda opcion, que es la que yo tambien habia pensado, aunque el tamaño no sea real, sera aproximado.

Gracias por la ayuda.
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
calcular e intercambiar datos entre dos o mas tablas miguelgalindo87 Tablas planas 2 02-02-2013 05:49:42
¿como optimizar rendimiento y tamaño base de datos firebird 2.5? JXJ Firebird e Interbase 4 22-11-2010 02:51:45
Usar ActiveX importados en otras maquinas crijos Varios 1 21-01-2006 20:06:33
Calcular el tamaño de la descarga con IdHTTP sitrico Internet 0 24-01-2005 20:53:20


La franja horaria es GMT +2. Ahora son las 08:05: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