Ver Mensaje Individual
  #1  
Antiguo 22-06-2012
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Reputación: 19
Angel.Matilla Va por buen camino
Violación al ejecutar Query con MySQL

Vamos por partes. Tengo instalado MySQL Server 5.5 con el driver ODBC 5.1 y una conexión a la base de datos mediante TDatabase y TSession.

1. A pesar de estar definidos en los parámetros usuario y clave de la base de datos y estar puesto LoginPrompt a false siempre que empiezo la ejecución me pide ambos datos. No me importa porque es una aplicación que sólo voy a usar yo en local, pero me sorprende que lo haga. La conexión la hago así:
Código:
dAsociacion->Connected = false;
dAsociacion->Params->Clear();
dAsociacion->Params->Add("DATABASE NAME=asociacion");
dAsociacion->Params->Add("ODBC DSN=Asociacion_SQL");
dAsociacion->Params->Add("OPEN MODE=READ/WRITE");
dAsociacion->Params->Add("BATCH COUNT=200");
dAsociacion->Params->Add("LANGDRIVER=");
dAsociacion->Params->Add("MAX ROWS=-1");
dAsociacion->Params->Add("SCHEMA CACHE DIR=");
dAsociacion->Params->Add("SCHEMA CACHE SIZE=8");
dAsociacion->Params->Add("SCHEMA CACHE TIME=-1");
dAsociacion->Params->Add("SQLPASSTHRU MODE=SHARED AUTOCOMMIT");
dAsociacion->Params->Add("SQLQRYMODE=");
dAsociacion->Params->Add("ENABLE SCHEMA CACHE=FALSE");
dAsociacion->Params->Add("ENABLE BCD=FALSE");
dAsociacion->Params->Add("ROWSET SIZE=20");
dAsociacion->Params->Add("BLOBS TO CACHE=64");
dAsociacion->Params->Add("BLOB SIZE=32");
dAsociacion->Params->Add("USER NAME=root");
dAsociacion->Params->Add("PASSWORD=toledo");

sAsociacion->PrivateDir = ExtractFilePath(Application->ExeName);
sAsociacion->ConfigMode = cmSession;
sAsociacion->NetFileDir = ExtractFilePath(Application->ExeName) + "NetFile";

try
{
     sAsociacion->Active    = true;
     dAsociacion->Connected = true;
     sAsociacion->OpenDatabase(dAsociacion->DatabaseName);
}
catch(...)
{
}
donde dAsociacion es el TDatabase y sAsociacion es el TSession.

2. Tengo este TQuery:
Código:
SELECT num_socio, AES_DECRYPT(apellidos, 'Ju86Lfgsje340qW') apellidos, AES_DECRYPT(nombre, 'Ju86Lfgsje340qW') nombre, login_socio, activado FROM inscripciones WHERE activado = 'A' ORDER BY apellidos, nombre, num_socio
se ejecuta sin errores (al hacer el Open es cuando me pide usuario y clave de la base de datos). Con ese query quiero cargar un TListView de la siguiente forma:
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);
}
Es un código que jamás me ha dado problemas, pero en este caso una vez que ha cargado el primer registro y hago el segundo Add me da este error:
Cita:
Acces violation at address xxxx in module IDOBC32.DLL
siempre en el segundo Add y de ahí no pasa. Le he dado mil vueltas y no entiendo por qué me da ese error.

Por si acaso he probado cambiando el TListView por un TDBGrid y funciona casi bien; y digo casi bien porque en las dos primeras columnas (apellidos y nombre) en vez de el contenido de las mismas aparece el litereal (VARBYTES).

3. Otra cosa: En el query hago que viaje el valor de la clave de encriptación de los datos porque no he conseguido reemplazarla por una variable de MySQL. Según el manual debería ser $Clave, pero le da lo mismo. ¿Por qué puede ser? No me gustaría tener que ponerla a capón.
Responder Con Cita