Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-06-2011
rrosariom rrosariom is offline
Miembro
 
Registrado: abr 2007
Posts: 23
Poder: 0
rrosariom Va por buen camino
Exclamation Usuario Y Password Para Acceder A Una Aplicacion

Buenos Noche,

estoy desarrollando una aplicando con ORACLE EXPRESS 11g, y DELPHI 7, y en la parte de acceso de usuario y contrasena, estoy utilizando la vista de oracle DBA_USERS, que es donde tengo creado los usuarios, puesto que lo quiero manejar por ahi, para aprovechar las funcionalidades de seguridad de oracle, asi como tener una ventana de mantenimiento de usuario desde la aplicacion y asi no tener que introduccir usuario y password en el codigo del programa.

El tema, es que he realizado todo bien, pero cuando presiono o pincho el boton siempre me devuelve el mensaje del message, que es "Usuario o PassWord Invalido"

El Codigo es el siguiente:

Código Delphi [-]
form2.dbedit1.Clear;
form2.adoquery1.Close;
form2.adoquery1.sql.Clear;
  form2.adoquery1.SQL.Add('select username,password FROM DBA_USERS');
   form2.adoquery1.SQL.Add('where username =' + '''' + dbedit1.Text + '''') ;
     form2.adoquery1.SQL.Add('or password =' + '''' + dbedit2.Text + '''');
     form2.adoquery1.Open;
   if form2.adoquery1.RecordCount > 0
     then
       form1.showmodal
         else
           showmessage ('Usuario O PassWord Invalido');
Si alguien me puede ayudar utilizando esta forma para hacerlo lo mas sencillo posible, ya que quiero configurar la mayor parte del trabajo por la base de datos, por ejemplo cantidad de intentos fallidos, cambio de claves periódicas, etc, ya que ORACLE me provee todo eso, y con esto me facilito la codificación en delphi.

Espero por su ayuda.

Rolando.

Última edición por ecfisa fecha: 21-06-2011 a las 04:18:13. Razón: Etiquetas [DELPHI] [/DELPHI]
Responder Con Cita
  #2  
Antiguo 15-06-2011
Avatar de defcon1_es
defcon1_es defcon1_es is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuenca - España
Posts: 533
Poder: 21
defcon1_es Va por buen camino
Esta consulta implica que ya hay una conexión activa sobre la base de datos, por lo que problema de conexión no es.
¿Has probado a ejecutar la consulta directamente sobre la bd de oracle?
¿devuelve los registros que esperas?
También puede ser debido a que usas RecordCount del DataSet.
Por experiencia, si no "navegas" hasta el ultimo registro, la propiedad RecordCount puede devolver resultados erróneos.

Código Delphi [-]
form2.dbedit1.Clear;
form2.adoquery1.Close;
form2.adoquery1.sql.Clear;
form2.adoquery1.SQL.Add('select username,password FROM DBA_USERS');
form2.adoquery1.SQL.Add('where username = :NombreUsuario');
form2.adoquery1.SQL.Add('or password = :ClaveUsuario');
form2.adoquery1.ParamByName('NombreUsuario').AsString := dbedit1.Text;
form2.adoquery1.ParamByName('ClaveUsuario').AsString := dbedit2.Text;
form2.adoquery1.Open;
form2.adoquery1.Last; //En algunos componentes, si no "navegas" hasta el ultimo registro, la propiedad RecordCount devuelve resultados erróneos
if form2.adoquery1.RecordCount > 0
then
  form1.showmodal
else
  showmessage ('Usuario O PassWord Invalido');
__________________
Progress Openedge
https://abevoelker.com/progress_open...dered_harmful/


Delphi forever...
Responder Con Cita
  #3  
Antiguo 15-06-2011
Avatar de oesqueda
oesqueda oesqueda is offline
Miembro
 
Registrado: dic 2007
Ubicación: Guadalajara, Mexico
Posts: 66
Poder: 17
oesqueda Va por buen camino
Lightbulb

Porque no les gusta usar parametros como debe ser, jejejejeje.

ahi te va:

En tu ADOQUERY pon esta sentencia SQL:
Código SQL [-]
select ID FROM DBA_USERS where username = :NombreUsuario or password = :ClaveUsuario
Me imagino que manejas un campo ID o identificador.
Código Delphi [-]
form2.dbedit1.Clear; form2.adoquery1.Close; form2.adoquery1.ParamByName('NombreUsuario').AsString := dbedit1.Text; form2.adoquery1.ParamByName('ClaveUsuario').AsString := dbedit2.Text; form2.adoquery1.Open; if not form2.adoquery1.fieldbyname('ID').isnull then   form1.showmodal else   showmessage ('Usuario O PassWord Invalido');

Otra forma:

Código Delphi [-]
form2.adoquery1.Open; if form2.adoquery1.recordcount <> 0 then   form1.showmodal else   showmessage ('Usuario O PassWord Invalido');

Porque dependiendo tu propiedad cursortype es si devuelve todos los registros.
Bueno no siempre, pero si tienes registros devuelve -1 o los registros.
Si no tienes siempre devuelve 0 (CERO)

Y te doy un par de consejitos

1. Cambia el nombre de tus componentes: adoquery1 a aqyExisteUsuario
2. NO uses el adoquery usa el adodataset o el adocommand es mejor
3. si vas a usar el adoquery1 para otra consulta, mejor pon otro componente o crealo en tiempo de ejecucion.
4. Usa Datamodules te va a hacer la vida mas facil.

Saludos
__________________
OEsqueda
Responder Con Cita
  #4  
Antiguo 16-06-2011
rrosariom rrosariom is offline
Miembro
 
Registrado: abr 2007
Posts: 23
Poder: 0
rrosariom Va por buen camino
Continua mi error

Buenas Noche,

Lo hice como me dijiste y me da el mismo error.

Aqui algunas sentencias con modificaciones:

Código Delphi [-]
form2.dbedit1.Clear;
form2.adoquery1.Close;
form2.adoquery1.sql.Clear;
form2.adoquery1.SQL.Add('select username,password FROM DBA_USERS');
form2.adoquery1.SQL.Add('where username := NombreUsuario');
form2.adoquery1.SQL.Add('or password  := ClaveUsuario');
form2.adoquery1.Parameters.ParamByName('NombreUsuario').Value := dbedit1.Text;
form2.adoquery1.Parameters.ParamByName('ClaveUsuario').Value := dbedit2.Text;
form2.adoquery1.Open;
form2.adoquery1.Last; //En algunos componentes, si no "navegas" hasta el ultimo registro, la propiedad RecordCount devuelve resultados erróneos
if form2.adoquery1.RecordCount > 0
then
  form1.showmodal
else
  showmessage ('Usuario O PassWord Invalido');


=======================================================================================


form2.Adoquery1.Close;
form2.Adoquery1.Sql.Clear;
form2.Adoquery1.Sql.Add('Select * from dba_users');
form2.Adoquery1.Sql.Add('Where Username = '+QuotedStr(dbEdit1.Text));
form2.Adoquery1.Sql.Add('or password = '+QuotedStr(dbEdit1.Text));
form2.Adoquery1.Open;
form2.adoquery1.Last; 
if not form2.adoquery1.fieldbyname('username').isnull then
form1.showmodal
else
 showmessage ('Usuario O PassWord Invalido');
Espero tu ayuda nuevamente.

Bye,
Rolando.

Última edición por ecfisa fecha: 21-06-2011 a las 04:18:31. Razón: Etiquetas [DELPHI] [/DELPHI]
Responder Con Cita
  #5  
Antiguo 16-06-2011
rrosariom rrosariom is offline
Miembro
 
Registrado: abr 2007
Posts: 23
Poder: 0
rrosariom Va por buen camino
Exclamation Error Logico Control De Acceso

Olvide decirte que las sentencias que le envie es para que me ayude a analizarla, ya que el error continua

Gracias,
Rolando.
Responder Con Cita
  #6  
Antiguo 16-06-2011
Avatar de defcon1_es
defcon1_es defcon1_es is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuenca - España
Posts: 533
Poder: 21
defcon1_es Va por buen camino
No contestaste a mis 2 preguntas:

¿Has probado a ejecutar la consulta directamente sobre la bd de oracle, sin ADO de por medio?

¿devuelve los registros que esperas?

Supongo que esto será un error tuyo de transcripción:
Código Delphi [-]
form2.adoquery1.SQL.Add('where username := NombreUsuario');
form2.adoquery1.SQL.Add('or password  := ClaveUsuario');
debe ser asi:
Código Delphi [-]
form2.adoquery1.SQL.Add('where username = :NombreUsuario');
form2.adoquery1.SQL.Add('or password = :ClaveUsuario');
__________________
Progress Openedge
https://abevoelker.com/progress_open...dered_harmful/


Delphi forever...
Responder Con Cita
  #7  
Antiguo 21-06-2011
rrosariom rrosariom is offline
Miembro
 
Registrado: abr 2007
Posts: 23
Poder: 0
rrosariom Va por buen camino
Exclamation Acceso a una aplicacion introduciendo usuario y clave

Hola que tal todos mis amigos.

Hace varios dias estoy tratando de crear una aplicacion que acceda a una base de datos ORACLE EXPRESS 11G, y al crear el codigo y las configuraciones de propiedades el programa me corre bien, pero cuando introduzco el usuario y clave siempre me da que es incorrecto aunque lo introduzca bien.

para validar el usuario, fue creado un registro en una tabla de la base de datos, y haciendo la consulta fuera de delphi me devuelve el valor correctamente.

Anexo el codigo para ver si alguien me puede ayudar:

Código Delphi [-]
var
  FLogon: TFLogon;
  Cuenta : integer;
  Usuario : String;
  LoginOK : boolean;

implementation

{$R *.dfm}

procedure TFLogon.BtnOKClick(Sender: TObject);
begin
// Ini
   LoginOK := False;
   // Buscamos si hay algun usuario con ese nombre
   ADLogin.Parameters.ParamByName('nom').Value:= EUsuario.Text;
      ADLogin.Active:= True;
//   EUsuario.Text:= ADLogin.Fields[1].AsString;
   // Si no hay ninguno es que ha fallado
   If ADLogin.RecordCount < 1 then begin
       // incrementamos la cuenta de intentos fallidos
       Cuenta := Cuenta + 1;
       // mensaje al usuario
       MessageDlg('Usuario no encontrado',mtError, [mbOK], 0);
       // limpiamos campos
       EUsuario.Text := '';
       EClave.Text := '';
       ADLogin.Active := False;
       adlogin.Open;
       EUsuario.SetFocus;

       // Si ya ha fallado 3 veces, SALIMOS
       If Cuenta = 3 then begin
          // Incorrecto
          ModalResult := mrCancel;
        end;
    end
   else
       // Ha encontrado uno con ese nombre...
       // Además coincide la clave (password)?
       If ADLoginClave2.AsString = EClave.Text then begin
           LoginOk := True;
           adlogin.Open;
           ADLogin.Active := False;

           // Correcto
           ModalResult := mrOk;

        end

        // usuario correcto, pero password incorrecto
        else Begin
           Cuenta := Cuenta + 1;
           MessageDlg('Clave Inválida',mtError, [mbOK], 0);
           EClave.Text := '';
           ADLogin.Active := False;
           If Cuenta = 3 then begin
              // Incorrecto
              ModalResult := mrCancel;
              adlogin.Open;
              EUsuario.SetFocus;
           end;


Este codigo lo tome del foro, y lo adapte a mi aplicacion.

Un Saludo,
Rolando.

Última edición por Neftali [Germán.Estévez] fecha: 21-06-2011 a las 10:06:21.
Responder Con Cita
  #8  
Antiguo 21-06-2011
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.285
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Hola.
Por favor, utiliza TAG's cuando escribas código.

En cuanto al código.
¿Lo has ejecutado paso a paso? Sería lo más sencillo para saber qué está fallando
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #9  
Antiguo 21-06-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Neftali Ver Mensaje
Y no repitas hilos, los he unido los dos.

Y recuerda leer nuestras normas, gracias.
Responder Con Cita
  #10  
Antiguo 22-06-2011
rrosariom rrosariom is offline
Miembro
 
Registrado: abr 2007
Posts: 23
Poder: 0
rrosariom Va por buen camino
Exclamation Hola

Disculpa es que no tengo experiencia en el foro.

Ejecute el codigo linea por linea, y cuando llega al if, salta al showmessage, por lo que cambie el codigo y puse que si adoquery1.recordcount=0 que cargue el form2.

Aparentemente, no esta guardando en memoria la consulta. o algo esta pasando que lo esta limpiando.

que sera?
Responder Con Cita
  #11  
Antiguo 22-06-2011
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Es una simple validacion, el problema es que el parametro que coincide.
Saludos
__________________
Siempre Novato
Responder Con Cita
  #12  
Antiguo 22-06-2011
rrosariom rrosariom is offline
Miembro
 
Registrado: abr 2007
Posts: 23
Poder: 0
rrosariom Va por buen camino
Hola

No entendi el comentario "Es una simple validacion, el problema es que el parametro que coincide"

Bye,
Rolando.
Responder Con Cita
  #13  
Antiguo 22-06-2011
leofuentes21 leofuentes21 is offline
Miembro
NULL
 
Registrado: feb 2011
Ubicación: la ceiba, atlantida
Posts: 66
Poder: 14
leofuentes21 Va por buen camino
Pon el codigo que tienes ahorita y donde te da el error..
Responder Con Cita
  #14  
Antiguo 22-06-2011
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
No trates de abarcar muchas cosas hasta no entender una plenamente. Me refiero a que antes de ponerte a manejar número de intentos inválidos y demás yerbas, primero te asegures que la consulta que quieres está funcionando.

Fíjate que en tu menaje original tienes esta consulta:

Código SQL [-]
select username,password FROM DBA_USERS
where username = ...
or password =

De entrada, esto es incorrecto, pues en lugar de or debería ser and, aunque en realidad, lo más adecuado sería simplemente:

Código SQL [-]
select username,password FROM DBA_USERS
where username = ...

es decir, sin la condición del password. Si encuentras una coincidencia, entonces sí, compara el password de la base con el que te dan.

Otra cosa: realmente no es lo más adecuado usar RecordCount para determinar si se encontraron registros coincidentes. Lo más recomendable es usar el método IsEmpty.

// Saludos
Responder Con Cita
  #15  
Antiguo 22-06-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por roman Ver Mensaje
No trates de abarcar muchas cosas hasta no entender una plenamente.
Totalmente de acuerdo.

Otra cosa que no entiendo rrosariom, es que has que cambiado por completo el código inicial (sobre el que respondí en el mensaje #18) .
En ese mismo post, coincidiendo con los acertados consejos de roman, se usa and e IsEmpty en las comparaciónes. ¿ Probaste ese código ?

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #16  
Antiguo 22-06-2011
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
No me había fijado que ya defcon1_es había, desde un principio, hecho notar lo de RecordCount. Aunque no estoy de acuerdo con la solución propuesta de utilizar Last puesto que ello implica traerse todos los registros al cliente.

Pero otra cosa que recién noto, y que me parece que ahí puede estar el porque no encuentra coincidencias, es que la consulta (al menos la original) compara directamente la contraseña almacenada en la tabla con la que escribe el usuario. Pero eso no puede ser, porque la contraseña en la base está encriptada, tal como se lee aquí:

Código:
PASSWORD 	VARCHAR2(30) 	  	Encrypted password
Luego entonces, habria primero que encriptar lo que escribe el usuario (desde luego, con la misma encriptación que la que se use en DBA_USERS) y compararla.

Por otra parte, no se entiende en realidad cómo se están capturando los datos de usuario y contraseña; pues es bastante extraño usar DBEdits para ello.

// Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
cambiar password del usuario sysdba walace_soy Firebird e Interbase 27 23-06-2015 09:39:18
acceder a carpeta remota con password chinchan C++ Builder 2 12-04-2011 13:33:59
validar dos campos (password y usuario) Yessy OOP 18 28-07-2006 21:59:15
Usuario y Password con TQuery en MyODBC mutant09 Conexión con bases de datos 9 23-04-2004 19:19:04
Dar Master Password a Paradox para que no lo haga el usuario nefy Conexión con bases de datos 3 03-01-2004 19:01:30


La franja horaria es GMT +2. Ahora son las 17:52:11.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi