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.