PDA

Ver la Versión Completa : SQLite 3 --> Capturar el contenido de los campos en una variable


kakarotv5
26-11-2007, 13:20:26
Hola, necesito capturar el contenido de los campos de una base de datos SQLite en una variable de tipo string.

Si hago esto:


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:

Project raised exception class 'RunError(231)'.

Si hago esto entonces funciona:


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

DataToSend := DataToSend +
dsTest.FieldByName['Code'].AsString + '\' +
dsTest.FieldByName['Name'].AsString + '\' +
dsTest.FieldByName['Address'].AsString + '#';

afxe
26-11-2007, 13:34:21
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:


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:

Project raised exception class 'EVariantInvalidOpError'

EDITO: Al final lo he solucionado así:


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