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)
-   -   ¿Como Guardar un "RECORD" en un campo BLOB? (https://www.clubdelphi.com/foros/showthread.php?t=11871)

sitrico 28-06-2004 21:44:37

¿Como Guardar un "RECORD" en un campo BLOB?
 
Tengo una aplicación en la que debo guardar un grupo de totales en una base de datos (en realidad no es mas que un arreglo dinamico) y estoy tratando de usar un unico campo blob para almacenar todos los datos. Pero no se como asignar mi variable al contenido del campo memo.

Algo así:

Código:

Type
tRsm = Record
  Exe : Currency;
  Imp : Array [1..3,1..2] of Currency;
  Nac : Array [1..3,1..2] of Currency;
  Ret : Array [1..3] of Currency;
  tDedu : Currency;
  Aju : Currency;
  End;

// Defino una variable

Var
rsm : tRsm;

// Pero como la guardo
Begin
db.edit
// db.Rsm.Assign(rsm); // No Funciono
// db.Rsm.asVariant := rsm; // Menos
db.post;
End;

De hecho he podido leer y escribir campos memo con stream pero no se como convertir una variable en un stream para usar un db.rsm.LoadFromStream

delphi.com.ar 28-06-2004 22:00:07

Tratándose de un record de tamaño fijo, primero no utilizaría un campo BLOB ya que esta información cave en 144 bytes, por otro lado, tienes muchas formas de hacerlo, por ejemplo copiando el fragmento de memoria que ocupa el stream en un string, o bien utilizando registros mixtos:
Código Delphi [-]
type
   TRsm = record
    case Integer of
      0: ( Exe: Currency;
           Imp: array[1..3, 1..2] of Currency;
           Nac: array[1..3, 1..2] of Currency;
           Ret: array[1..3] of Currency;
           tDedu: Currency;
           Aju: Currency;
         );
      1: (Data: array[0..143] of char);
   end;

Saludos!

sitrico 28-06-2004 23:11:11

Gracias por la sugerencia, pero muy a mi pesar el registro no siempre será el mismo y menos del mismo tamaño por eso opté por complicarme la vida con los campos blob. Pero en cuanto a la segunda opción como copio la memoria ocupada por una variable (o arreglo) a un stream. estoy usando:

Código Delphi [-]
Procedure LeerMontosDeclaracion(Var tot:tDeclaracion; cmp : TBlobField);
Var
m : TMemoryStream;
Begin
FillChar(tot,sizeOf(tot),0);  // siempre vaciar anter 
m := TMemoryStream.Create;
try
   cmp.SaveToStream(m);
   m.ReadBuffer(Tot,SizeOf(tot));
Finally;
   m.Free;
   End;
End;

Procedure GuardarMontosDeclaracion(tot:tDeclaracion; cmp : TBlobField);
Var
m : TMemoryStream;
Begin
m := TMemoryStream.Create;
try
   m.WriteBuffer(Tot,SizeOf(tot));
   cmp.LoadFromStream(m);
Finally;
   m.Free;
   End;
End;

Pero no funciona la lectura porque se me genera una "EReadError"

jachguate 29-06-2004 08:53:49

Cita:

Empezado por sitrico
Pero no funciona la lectura porque se me genera una "EReadError"

Quizas haga falta un

m.seek(0, soFromBeginning);

antes de la llamada a ReadBuffer.

Hasta luego.

;)

delphi.com.ar 29-06-2004 15:31:47

Cita:

Empezado por sitrico
...el registro no siempre será el mismo y menos del mismo tamaño...

Recuerda que vas a tener que identificar el tipo de registro antes de leerlo. Por otro lado, recuerda que si el registro tiene datos, por ejemplo Strings, estos son de longitud variable.

¿No prefieres tener tablas para cada tipo de registro, y guardar los datos en campos?

sitrico 29-06-2004 17:32:01

Gracias a ambos, lo del campo con el identificador para el tipo de datos ya lo tenia previsto. En cuanto a la lectura, efectivamente faltaba el "m.seek" la rutina quedo así:

Código Delphi [-]
Procedure LeerMontosDeclaracion(Var tot:tDeclaracion; cmp : TBlobField);
Var
m : TMemoryStream;
Begin
FillChar(tot,sizeOf(tot),0);
m := TMemoryStream.Create;
try
   cmp.SaveToStream(m);
   m.seek(0, soFromBeginning);
   m.SetSize(SizeOf(tot));
   m.ReadBuffer(tot,SizeOf(tot));
Finally;
   m.Free;
   End;
End;

Con estos procedimientos creo que se puede leer y/o guardar cualquier buffer de memoria en un campo blob (ajustando el tipo del parametro del procedimiento).


La franja horaria es GMT +2. Ahora son las 03:01:49.

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