Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Query MySQL: ¿Por qué no funciona?

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Query MySQL: ¿Por qué no funciona? Responder citando

Me estoy volviendo loco; vale que es la primera vez que me enfrento a esta base de datos y seguor que estoy haciendo muchas cosas mal, pero así y todo me está volviendo loco.

Estoy usando TDatabase, TSession y TQuery normales, de la paleta Data Access. Tengo este query:
Código:
Query->Close();
Query->SQL->Clear();
Query->SQL->Text = "SELECT num_socio, AES_DECRYPT(apellidos, 'Ju86Lfgsje340qW') apellidos, AES_DECRYPT(nombre, 'Ju86Lfgsje340qW') nombre, login_socio, activado FROM inscripciones WHERE activado IN ('A', 'P') ORDER BY apellidos, nombre, num_socio";
Query->Prepare();
Query->Open();

Se ejecuta sin dar ningún error pero al recorrerlo con este bucle para cargar un TListView:
Código:
for (; !Query->Eof; Query->Next())
{
     pItem = Lista->Items->Add();
     pItem->Caption = Query->FieldByName("apellidos")->AsString + ", " + Query->FieldByName("nombre")->AsString;
     pItem->SubItems->Add(Query->FieldByName("login_socio")->AsString);
     pItem->SubItems->Add(Query->FieldByName("num_socio")->AsInteger);
     pItem->SubItems->Add(Query->FieldByName("activado")->AsString);
}

sólo me reconoce el primer registro y en cuanto trato de leer el segundo me da un Acces violation error. He probado a cambiar la forma de recorrer la salida del query, pero lo ponga como lo ponga siempre da el mismo error y el query tiene 511 registros comprobados ejecutándolo en el shell de mysql.

Si en lugar de usar los componentes de Data Access uso los de la paleta ADO el bucle se recorre bien, pero al leer los datos de un registro cualquiera o cambiar las condiciones del query, poniendo por ejemplo WHERE activado = 'S' me sale el mensaje de El valor de BOF o EOF es True,o el actual registro se eliminó.

De verdad, ya no sé que hacer para que se ejecute bien el query. Cualquier ayuda es bien recibida.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola Angel,

Yo no veo nada anormal en la consulta, pero te daré un consejo que a mi me ha ido muy bien a la hora de depurar. En este caso, dices que estas comenzando a usar my sql y estás intentando rellenar un listview. Yo probaría por separado... es decir, prueba que el query esta funcionando correctamente recorriendo los registros sin añadir al pitem, solo con un
Código:

ShowMessage(Query->FieldByName("apellidos")->AsString)

Lo digo porque a veces buscando el error en un sitio se tiene en otro.
Me imagino que antes del for tendras declarado el pitem con un:
Código:
TListItem *pItem;

ya que si lo declaras con
Código:
TListItem pItem;

estaria mal.

Un saludo
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

juanma escribió:
Código:
ShowMessage(Query->FieldByName("apellidos")->AsString)

He probado con esto, metiendo el valor en una variable AnsiString... El primer registro lo saca bien pero al siguiente

juanma escribió:
Me imagino que antes del for tendras declarado el pitem con un:
Código:
TListItem *pItem;

ya que si lo declaras con
Código:
TListItem pItem;

Sí, claro que está declarado bien.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola Angel, solo por ir descartando cosas, porque no pruebas por un lado a sacar un sql donde no intervenga la encriptacion(*):
Código:
"SELECT num_socio, login_socio, activado FROM inscripciones WHERE activado IN ('A', 'P') ORDER BY apellidos, nombre, num_socio";

y por otro a recorrerlo de una forma un poco mas clásica:
Código:
while (!Query->Eof)
{
ShowMessage(..);
Query->Next();
}


Saludos.

(*) Sobre encriptar campos, no te he comentado nada, pero hay por ahí mucho escrito, como por ejemplo que no tiene sentido indexar por dichos campos ya que no optimizaria nada las busquedas o filtros por dichos campos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Bueno: Quitando la encriptación carga toda la tabla. Me toca buscarme las rutinas de encriptación para poder cargar lo que leo en el formulario. Algo encontré en Google, pero me parece recordar que estab escrito en Pascal. Gracias por la ayuda.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

A ver. He "solucionado" el problema de una forma un pelín pedestre: declarando un TQuery SÓLO para sacar los datos encriptados. Y al menos de momento funciona.
Código:
TQuery *qSocio = new TQuery(this);
qSocio->DatabaseName = Query->DatabaseName;
qSocio->SessionName  = Query->SessionName;

Query->Close();
Query->SQL->Clear();
Query->SQL->Text = "SELECT num_socio, login_socio, activado FROM inscripciones WHERE activado IN (" + cAux + ") ORDER BY apellidos, nombre, num_socio";
Query->Prepare();
Query->Open();

qSocio->Close();
qSocio->SQL->Text = "SELECT AES_DECRYPT(apellidos, 'Ju86Lfgsje340qW') apellidos, AES_DECRYPT(nombre, 'Ju86Lfgsje340qW') nombre FROM inscripciones WHERE login_socio = :login";

Lista->Items->Clear();
for (; !Query->Eof; Query->Next())
{
     qSocio->Close();
     qSocio->ParamByName("login")->AsString = Query->FieldByName("login_socio")->AsString;
     qSocio->Open();

     pItem = Lista->Items->Add();
     pItem->Caption = qSocio->FieldByName("apellidos")->AsString + ", " + qSocio->FieldByName("nombre")->AsString;
     pItem->SubItems->Add(Query->FieldByName("login_socio")->AsString);
     pItem->SubItems->Add(Query->FieldByName("num_socio")->AsInteger);
     pItem->SubItems->Add(Query->FieldByName("activado")->AsString);
}

Es como si el problema viniera de combinar los dos tipos de datos (encriptados o no).
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.