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


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Vie 22 Jul, 2005 8:17 pm Asunto: Me estoy volviendo loco |
|
|
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 |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Vie 22 Jul, 2005 10:02 pm Asunto: Conocen alguna forma |
|
|
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 |
|
 |
alfredo Master

Registrado: 13 Oct 2003Mensajes: 246Ubicación: Valencia Venezuela
|
Publicado: Jue 18 Ago, 2005 10:21 pm Asunto: |
|
|
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"
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 |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Sab 27 Ago, 2005 5:37 am Asunto: |
|
|
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 |
|
 |
alfredo Master

Registrado: 13 Oct 2003Mensajes: 246Ubicación: Valencia Venezuela
|
Publicado: Sab 27 Ago, 2005 5:08 pm Asunto: |
|
|
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 |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Sab 27 Ago, 2005 7:56 pm Asunto: |
|
|
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 |
|
 |
alfredo Master

Registrado: 13 Oct 2003Mensajes: 246Ubicación: Valencia Venezuela
|
Publicado: Sab 27 Ago, 2005 9:31 pm Asunto: |
|
|
| 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 |
|
 |
|
|
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.
|