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 14-04-2005
JAV JAV is offline
Miembro
 
Registrado: mar 2005
Posts: 34
Poder: 0
JAV Va por buen camino
Thumbs up Guardar estructura en tabla

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.
Responder Con Cita
  #2  
Antiguo 14-04-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
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.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 15-04-2005
JAV JAV is offline
Miembro
 
Registrado: mar 2005
Posts: 34
Poder: 0
JAV Va por buen camino
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...
Responder Con Cita
  #4  
Antiguo 15-04-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #5  
Antiguo 16-04-2005
JAV JAV is offline
Miembro
 
Registrado: mar 2005
Posts: 34
Poder: 0
JAV Va por buen camino
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;
Responder Con Cita
  #6  
Antiguo 16-04-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #7  
Antiguo 17-04-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
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.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #8  
Antiguo 19-04-2005
JAV JAV is offline
Miembro
 
Registrado: mar 2005
Posts: 34
Poder: 0
JAV Va por buen camino
Thumbs up Solucionado

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.
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


La franja horaria es GMT +2. Ahora son las 02:02:46.


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