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 

Me estoy volviendo loco

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Me estoy volviendo loco Responder citando

En Interbase 7:

Tengo esto en el evento Login de la base de datos:
Código:

void __fastcall TMDatos::IBDatabaseLogin(TIBDatabase *Database,
      TStrings *LoginParams)
{
    LoginParams->Values["USER_NAME"] = Codificar("NombreUsuario",0);
    LoginParams->Values["PASSWORD"] = Codificar("Mi_Clave",0);
}


Y funciona perfectamente cuando conecto mi aplicación, pero después de restaurar la base de datos, para lo cual tengo previamente que desconectarme, intento conectar otra vez para así continuar con la aplicación sin tener que salir de ella; y ahí es donde está el problema. Me dice que el user_name y el login no están definidos.

Pues bien, usando el depurador para ver donde estaba el problema, me he llevado una sorpresa, que no acabo de entender.

Me explicaré: La función “Codificar()”, es una función propia, la cual me devuelve un AnsiStrin codificado, o decodificado según sea el segundo parámetro (0, o 1), la función funciona perfectamente, cuando la aplicación la ejecuto la primera vez, todo sale correctamente, pero cuando tras una restauración de la base de datos, para lo cual me desconecto, luego resulta que cuando la aplicación vuelve a leer el “evento Login” me dice que no es correcto porque parece ser que hace caso omiso de la función “Codificar()”. Mi pregunta es porque la primera vez pasa y la segunda cuando estando desconectado del servidor he intento conectar me dice que no. He probado a poner los datos de usuario y password sin codificar sin ningún cambio más en la aplicación, y entonces no surge dicho problema. ¿ALGUIEN SAVE QUE ME ESTÁ PASANDO?

La verdad ya no sé que hacer, me estoy bolviendo LOCO
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Conocen alguna forma Responder citando

Como se hace para que despues de recuperar una copia de seguridad,
pueda seguir trabajando con mi aplicacion sin tener que salir al sistema operativo y volver a entrar a mi aplicación???????

Si no salgo al sistema operativo inmediatamente depues de recuperar una copia de seguridad, luego al salir la aplicacion se me queda colgada esperando respuesta del servidor. GRACIAS por leerlo.
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Hola, por lo que puedo ver y entrever me parece que tu aplicacion es un usuario mas de IB y hace login al iniciar, ademas estas encriptando user y password para que no lo puedan leer usando un editor hexadecimal.

La Encriptacion no es el problema...

El compo TIBDatabase borra el password despues de intentar la conexion por motivos de seguridad, por esta razon al intentar reconectar te rechaza el login.

Interbase tiene muchas cosas buenas y utiles que quienes venimos de utilizar bases de datos de escritorio no sabemos aprovechar en todo su potencial, una de ellas es precisamente el control de usuarios y privilegios.

Puedes solucionar tu problema especifico con solo cambiar el enfoque de "mi aplicacion es un usuario" a "mi aplicacion conecta a los usuarios"
ademas de dar nuevas potencialidades a tu programa asignando usuarios y privilegios. Por ejemplo tengo una aplicacion donde unos usuarios pueden crear registros en cierta tabla pero no modificarla, otros pueden modificarlos pero no crearlos, otro puede borrar los registros y cualquier combinacion que sea necesaria.

Te recomiendo que pongas un Menuitem "Conectar" con el siguente codigo:
Código:
void __fastcall ConectarClick(TObject *Sender)
{
if(!IBDatabase1->Active)
  IBDatabase1->Open();
else
   IBDatabase1->Close();
}
y en el evento AfterConnect
Código:

Conectar->Caption="Desconectar";
en el AfterDisconnect
Código:

Conectar->Caption="Conectar";

Puedes poner LoginPrompt a true, o usar tu propio dialogo de conexion, en mi caso el dialogo se llama fConexion y tiene un par de Edits para User y Password, este se muestra en el evento BeforeConnect que es el mas apropiado para este fin y el codigo es:
Código:

fLogin->ShowModal();
IBDatabase1->Params->Add("user="+User->Text);//Edit del user
IBDatabase1->Params->Add("password="+Pass->Text);//Edit del Pass


Ademas tiene botones de aceptar y cancelar, pero no pongo el codigo para no quitarle claridad a lo principal.

Lo anterior te permitira reconectarte y desconectarte sin salir de la aplicacion, puedes crear un usuario con todos los privilegios y usar este en lugar de SYSDBA o parcelar estos entre varios usuarios, reservandote el super usuario para ti, claro cambiandole el pass por el de tu preferencia. Acostumbro hacer esto cuando cuando instalo un demo, en una tabla a la cual solo accede SYSDBA pongo la fecha de vencimiento o la cantidad de "usos" y hago un trigger que verifica la validez al insertar nuevos registros en las tablas clave y lanza una excepcion que impide la insercion, todo esto sin necesidad de modificar mi aplicacion.

"Sr. Programador me sale un mensaje raro cuando acepto el registro"
"Ahh Si? verifique con contabilidad si salio un cheque a mi nombre" Wink

Cuando desees aplicar usuarios y privilegios te recomiendo no usar TIBTables, puedes usar TIBDataSets o Querys, las tablas no abren si el usuario no tiene todos los privilegios, basta que falte uno para fallar la apertura.

Espero que te sea util aunque me tome la libertad de enfocar de otra manera.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Gracias por contestar, pero la aplicación que estoy haciendo no tiene la necesidad de conectar y desconectar usuarios, por ello no quiero que se pidan los datos de conexión en ningún momento.

¿Hay otra forma de conectar y desconectar sin salir de la aplicación, pasándole los valores codificados y sin tener que mostrar el dialogo de conexión?

Gracias Alfredo.
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Por supuesto que es posible, imagino que abres el Database en el evento FormShow, bueno no importa el evento donde lo abres al principio, talvez ya esta abierto, simplemente vuelve a abrir la conexion despues de finalizado el restore. Como utilizas el evento OnLogin del IBDatabase basta con poner IBDatabase1->Open(); para reconectar, claro hay que hacerlo en el momento oportuno es decir una vez finalizada la restauracion (no se que pudiese ocurrir al conectarse a una BD mientras esta siendo grabada al disco).
No se como estas realizando la restauracion, si usas un TIBRestoreService he visto que tiene la propiedad Eof la cual supongo debe indicar cuando se alcanzo a grabar por completo en el disco el archivo, como no tiene un evento que nos indique cuando se completo la grabacion podemos usar el evento OnAttach con un bucle consultando el Eof, algo asi
Código:
void __fastcall TfMenu::IBRestoreService1Attach(TObject *Sender)
{
while(true)
 {
   if(IBRestoreService1->Eof)//Chequeamos
   {
     IBDataBase1->Open();//Reabrimos la database
     break;//salimos del bucle
   }
 }
}
//-------
No he utilizado el IBDatabaseRestore pero deberia funcionar.
Ahora si estas usando otro metodo para la restauracion el principio es el mismo, mira cuando termina la grabacion al disco y luego:
Código:
IBDatabase1->Open();
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Alfredo, como tu bien dices, compruebo que la restauracion a sido completada, asi mismo utillizo el componente RestoreService de IBDatabase como tu bien mencionas. ME EXPLICARE:
Si en el codigo pongo el evento del login, dá igual donde, es decir en el create form, OnShow, OnLogin o donde sea y le paso los parametros sin codificar, pues todo funciona correctamente, es decir puedo restaurar, hacer copia, conectar y desconectar a mi antojo. ES DECIR WUAY. Pero si solo cambio mi codigo pasandole los valores codificados sin cambiar nada mas del codigo, la segunda vez que intento abrir la BDD, una vez la he cerrado, me dice que NANAY DE LA CHINA. Raro verdad......? Espero haberme explicado mejor....GRACIAS por tu interés.
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

ahhh... es curioso, a ver trata de mover el codigo que esta en el evento OnLogin al evento BeforeConnect del IBDataset si sigue fallando salte de los eventos del IBDataset y haz una funcioncita para cargar los parametros y luego abrir la BD.
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.