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)
-   -   SQLite 3 --> Capturar el contenido de los campos en una variable (https://www.clubdelphi.com/foros/showthread.php?t=50707)

kakarotv5 26-11-2007 13:20:26

SQLite 3 --> Capturar el contenido de los campos en una variable
 
Hola, necesito capturar el contenido de los campos de una base de datos SQLite en una variable de tipo string.

Si hago esto:

Código Delphi [-]
while not dsTest.EOF do
 begin
  DataToSend := DataToSend + 
  dsTest.FieldValues['Code'] + '\' +
  dsTest.FieldValues['Name'] + '\' + 
  dsTest.FieldValues['Address'] + '#';
  dsTest.Next;
 end;

Obtengo el siguiente mensaje de error:

Código:

Project raised exception class 'RunError(231)'.
Si hago esto entonces funciona:

Código Delphi [-]
while not dsTest.EOF do
 begin
  Cod := dsTest.FieldValues['Code'];
  Nam := dsTest.FieldValues['Name'];
  Addr := dsTest.FieldValues['Address'];
  DataToSend := DataToSend + Cod + '\' + Nam + '\' + Addr + '#';
  dsTest.Next;
 end;

Pero tengo que declarar tres variables de tipo string (Cod, Nam and Addr).

¿Alguien me ayuda?

basti 26-11-2007 13:26:05

Probablemente el error provenga de algún tipo de conversión automática de Variant con los operadores '+'.

Prueba con
Código Delphi [-]
      DataToSend := DataToSend + 
                             dsTest.FieldByName['Code'].AsString + '\' +
                             dsTest.FieldByName['Name'].AsString + '\' + 
                             dsTest.FieldByName['Address'].AsString + '#';

afxe 26-11-2007 13:34:21

FieldValues devuelve Variant.
 
El problema es que si accedes a la propiedad FieldValues de los campos obtienes un Variant, es decir un dato de tipo variable, que hasta que no sea usado no se define su tipo. Por eso te funciona cuando lo asignas a variables, porque la variable ya tiene tipo. Utiliza la propiedad FieldByName o los campos persistentes más el tipo de aceso que le quieras hacer: .AsInteger, .AsString, .AsDateTime....

oops.. veo que se me han adelantado en la respuesta.

Saludos-

kakarotv5 26-11-2007 13:34:34

Lo he cambiado por esto:

Código Delphi [-]
while not dsTest.EOF do
 begin
  DatosAEnviar := DatosAEnviar +
                        dsTest.FieldValues['Código'].AsString + '\' +
                        dsTest.FieldValues['Nombre'].AsString + '\' +
                        dsTest.FieldValues['Dirección'].AsString + '#';
  dsTest.Next;
 end;

y me da este error:

Código:

Project raised exception class 'EVariantInvalidOpError'
EDITO: Al final lo he solucionado así:

Código Delphi [-]
while not dsTest.EOF do
 begin
  DatosAEnviar := DatosAEnviar +
                         dsTest.FieldByName('Código').AsString + '\' +
                         dsTest.FieldByName('Nombre').AsString + '\' +
                         dsTest.FieldByName('Dirección').AsString + '#';
  dsTest.Next;
 end;

Por cierto, veo que sabeis de SQLite, yo no he encontrado mucha información al respecto de esta base de datos, ¿sabéis de algún buen manual?

Gracias a todos y un saludo.

afxe 27-11-2007 09:56:54

Particularmente no he trabajado con ella.
 
No he trabajado nunca con SQLite, lo que pasa es que tu duda era sobre el acceso a la clase TField de un TDataSource, y ese es un problema de uso de dichas clases, independientemente del motor de base de datos que elijas. Es decir, te hubiese pasado lo mismo si hubieras usado Firebird, Interbase, Paradox o Dbase.

Saludos.


La franja horaria es GMT +2. Ahora son las 01:25:15.

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