PDA

Ver la Versión Completa : Guardar estructura en tabla


JAV
14-04-2005, 00:13:48
Hola amigos,
Necesito guardar una estructura (record) que contiene una considerable cantidad de datos en un campo binario de una base. No sé como pasársela. Estoy usando ADO y SQL Server con un campo de tabla "varbinary". Si alguien conoce como hacerlo, no necesariamente con los elementos expuestos anteriormente, con algún truco, por favor responderme.
Desde ya, muchas gracias.

Lepe
14-04-2005, 10:39:19
con varBinary, ni idea, pero si puede ser varchar, simplemente podrías concatenar los datos de los registros con un separador.

registro1Dato1 <SepCampo> registro1Dato2 <SepRegistro>

Espero que puedas usarlo.

JAV
15-04-2005, 01:47:54
El problema es que dentro del "record" tengo 3 vectores de 200 elementos cada uno, tengo que guardar el record como "varbinary" por el tamaño de los datos.
Conseguí guardarlo con un Stream pero el inconvemiente que se me presenta ahora es cómo consultarlo en la base de datos ya que al hacer la query me lo guarda en un campo del tipo TVarBytesField y este no tiene métodos para manejo de Stream. Intenté convertirlo de mil maneras pero me da error. Por favor, si alguien sabe cómo leer un campo varbinary de SQL Server y volverlo a guardar en una estructura o "record" en Delphi, desde ya se agradece...

roman
15-04-2005, 02:16:03
Leyendo la ayuda de Delphi veo que TVarBytesField tiene la propiedad AsString que es la que contiene los datos. El apartado referente a esta propiedad nos recuerda que el tipo de datos string no se limita a texto, sino que de hecho puede almacenar cualquier secuencia de bytes.

Por otra parte, dispones de la clase TStringStream- descendiente de TStream que se inicializa justamente con un string.

Así que yo creo que con esto tienes para empezar.

// Saludos

JAV
16-04-2005, 20:55:25
Probé con TStringStream pero no me funciona. El problema es que lo que está guardado en el cmpo binario es una estructura, no un string. Cuando yo hago un "select" de la tabla, el campo que me retorna es un TVarBytesField y si le pongo "AsString" me muestra cualquier cosa. Distinto sería si yo guardara el binario como un string, en ese caso al ponerle la propiedad "AsString" al campo devuelto, me lo muestra perfecto. La cuestión es cómo recuperar la "estructura" guardada en binario, en una variable del mismo formato, se tiene que poder hacer. Se aceptan opiniones... Muchas gracias.

Formato de la estructura:

TEstructura = record
Campo1: Integer;
Campo2: Char;
Campo3: Single;
Vector1, Vector2, Vector3: Array [0..199] of Integer;
end;

roman
16-04-2005, 21:12:36
Los campos de tipo BLOB, como supongo es el VarBinary, sirven para almacenar cualquier cosa que el motor de la base no entiende, como una foto, un sonido o, en tu caso, un record. Por otro lado, como ya te mencioné antes, el tipo string en Delphi también sirve para almacenar cualquier cosa, no necesariamente texto. De ahí que el campo VarBytesField presente su contenido como AsString. Otra cosa es que tú debes saber leer la secuencia de bytes alamacenada y traducirla al formato requerido.

Dices que si le pones AsString te muestra cualquier cosa, pero no es así, te está mostrando los datos correctos, pero no estructurados en un record. Los campos BLOB no podrás enlazarlos directamente a un control de datos precisamente porque no hay control que sepa cómo manejar este tipo de datos.

Así que, en resumen, es de AsString de donde debes sacar la información almacenada, pero tendrás que ver como extraes cada uno de los campos del record.

// Saludos

Lepe
17-04-2005, 09:35:35
La solución que yo veo, aunque tarde, es traducir los record a una relación Maestro - Detalle, de esta forma los tres vectores formarían parte de la tabla detalle, el resto, formaría la tabla Maestra, de esta forma si puedes hacer un SELECT como quieras.

Ésto, junto con un par de rutinas que transformen el record en registros de base de datos y viceversa, y marchando.

Espero te sirva.

JAV
19-04-2005, 04:30:35
Amigos, lo solucioné cambiando el tipo de campo "varbinary" por "image" de SQL Server; de este modo Delphi lo capta como TBlobField y ya que este campo tiene los métodos "ReadFromStream" y "SaveToStream", cuando hago la consulta guardo el dato en un Stream y con TMemoryStream.ReadBuffer lo vuelvo a guardar en una variable del tipo "record".
Saludos...

Javier.