Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   ¿Cómo calcular el tamaño de datos importados? (https://www.clubdelphi.com/foros/showthread.php?t=86126)

pjmedina 20-06-2014 18:29:06

¿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

duilioisola 20-06-2014 20:21:14

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 ]

pjmedina 20-06-2014 20:42:59

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

Casimiro Notevi 20-06-2014 21:11:29

Cita:

Empezado por pjmedina (Mensaje 478101)
...

Recuerda poner los tags al código fuente, ejemplo:



Gracias :)

pjmedina 20-06-2014 21:13:57

Si los he puesto. No?

Casimiro Notevi 20-06-2014 21:33:08

Cita:

Empezado por pjmedina (Mensaje 478118)
Si los he puesto. No?

No te preocupes, había un error en las etiquetas, ya lo corregí.

duilioisola 21-06-2014 11:46:52

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.

pjmedina 21-06-2014 13:34:20

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.


La franja horaria es GMT +2. Ahora son las 19:11:03.

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