 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mar 26 Jun, 2012 11:22 am Asunto: Query MySQL: ¿Por qué no funciona? |
|
|
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 |
|
 |
juanma Cmdr

Registrado: 17 Nov 2005Mensajes: 127Ubicación: Almeria - España
|
Publicado: Mar 26 Jun, 2012 3:08 pm Asunto: |
|
|
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
estaria mal.
Un saludo |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mar 26 Jun, 2012 3:43 pm Asunto: |
|
|
| 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
|
Sí, claro que está declarado bien. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
juanma Cmdr

Registrado: 17 Nov 2005Mensajes: 127Ubicación: Almeria - España
|
Publicado: Mie 27 Jun, 2012 8:32 am Asunto: |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mie 27 Jun, 2012 12:38 pm Asunto: |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mie 27 Jun, 2012 3:48 pm Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|