Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Usuario Y Password Para Acceder A Una Aplicacion (https://www.clubdelphi.com/foros/showthread.php?t=74364)

rrosariom 15-06-2011 06:31:43

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.

defcon1_es 15-06-2011 12:23:22

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');

oesqueda 15-06-2011 18:13:15

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

rrosariom 16-06-2011 02:26:11

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.

rrosariom 16-06-2011 03:07:52

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.

defcon1_es 16-06-2011 12:26:22

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');

rrosariom 16-06-2011 15:18:40

Creando acceso de usuario a una aplicacion
 
Claro, eso lo hice antes de enviar el error antes de anoche. hice una consulta directamente a la base de datos, usando sqlplus y me devolvió el registro.

en cuanto a lo otro, cuando lo hago form2.adoquery1.SQL.Add('where username = :NombreUsuario'); entonces me da error.

Un Saludo,
Rolando.

Casimiro Notevi 16-06-2011 15:23:13

Hola rrosariom, recuerda que para contestar a un mensaje aquí, debes pulsar en el botón que está justo ahí abajo a la izquierda, el que pone "Responder", es que has enviado la contestación al email de contactos de clubdelphi.
Es sólo para que lo tengas en cuenta, gracias :)

rrosariom 16-06-2011 15:31:00

Control de Acceso a una aplicacion
 
este es el codigo que tengo actualmente:

Código Delphi [-]
 form2.adoquery1.Close;
form2.adoquery1.sql.Clear;
form2.adoquery1.SQL.Add('select username,password FROM DBA_USERS');
form2.adoquery1.SQL.Add('where username = :usuario');
form2.adoquery1.SQL.Add('or password = :clave');
form2.adoquery1.FieldByName('usuario').AsString := dbedit1.Text;
form2.adoquery1.FieldByName('clave').AsString := dbedit2.Text;
form2.adoquery1.Open;
form2.adoquery1.Last;
if form2.adoquery1.RecordCount <> 0
then
  form1.showmodal
else
  showmessage ('Usuario O PassWord Invalido');
  end;

y me presenta el siguiente error:

AdoQuery1:Field'usuario' not found'


Me faltara declarar algo?

maeyanes 16-06-2011 15:33:16

Hola...

El error es que estás usando FieldByName cuando deberías usar ParamByName.


Saludos...

rrosariom 16-06-2011 15:42:28

Error Para crear control de acceso a una aplicacion
 
Cuando lo uso asi:

form2.adoquery1.Parameters.ParamByName('usuario').AsString := dbedit1.Text;


me da el error de que el AsString no esta declarado (undeclared identified:AsString) , por en realidad lo reconoce como sigue:


form2.adoquery1.Parameters.ParamByName('usuario').value.AsString := dbedit1.Text;

porque no se le puede pasar ni el parambyname directamente al adoquery, debido a que lleva parameters primero (adoquery1.parameters.parambyname...)

Mientras en el caso del AsSring tampoco, puesto que primero hay que pasarle el .value.AsString...


Un Saludo,
Rolando.

rrosariom 16-06-2011 15:46:48

Actualmente, teniendo el codigo como sigue:

Código Delphi [-]
form2.adoquery1.Close;
form2.adoquery1.sql.Clear;
form2.adoquery1.SQL.Add('select username,password FROM DBA_USERS');
form2.adoquery1.SQL.Add('where username = :usuario');
form2.adoquery1.SQL.Add('or password = :clave');
form2.adoquery1.Parameters.ParamByName('usuario').value.AsString := dbedit1.Text;
form2.adoquery1.Parameters.ParamByName('clave').Value.AsString := dbedit2.Text;
form2.adoquery1.Open;
form2.adoquery1.Last;
if form2.adoquery1.RecordCount <> 0
then
  form1.showmodal
else
  showmessage ('Usuario O PassWord Invalido');
  end;
me muestra el siguiente error:

Invalid variant operation

es bueno decir que este codigo compila bien, es cuando presiono el boton que me devuelve el error.

Un Saludo,
Rolando.

leofuentes21 16-06-2011 16:00:08

hola a rrosariom prueva asi a ver k tal

Código Delphi [-]
form2.adoquery1.Close;
form2.adoquery1.sql.Clear;
form2.adoquery1.SQL.Add('select username,password FROM DBA_USERS');
form2.adoquery1.SQL.Add('where username = :usuario');
form2.adoquery1.SQL.Add('or password = :clave');
form2.adoquery1.Parameters.ParamByName('usuario').AsString := dbedit1.Text;
form2.adoquery1.Parameters.ParamByName('clave').AsString := dbedit2.Text;
form2.adoquery1.Open;
form2.adoquery1.Last;
if form2.adoquery1.RecordCount <> 0
then
  form1.showmodal
else
  showmessage ('Usuario O PassWord Invalido');
  end;

oesqueda 16-06-2011 16:08:26

Fe de erratas

Código Delphi [-]
form2.adoquery1.Parameters.ParamByName('usuario').Value := dbedit1.Text; form2.adoquery1.Parameters.ParamByName('clave').Value := dbedit2.Text; form2.adoquery1.Open; if form2.adoquery1.RecordCount <> 0 then   form1.showmodal else   showmessage ('Usuario O PassWord Invalido');

Es .VALUE

rrosariom 16-06-2011 16:27:54

Hola OSqueda
 
Me continua dando error.

Lo que no quiero es tener que utilizar la mala practica de utilizar este procedimeinto por codigo. Queria hacerlo, donde se pudiera dar mantenimiento de usuarios, es decir, crear, modificar, eliminar o bloquear, y que al acceder solo era cuestion de una consulta, y si el registro existe (es decir el usuario) entonces cargue un menu principal, y que segun su perfil, entonces se le habilite o habiliten las opciones del menu que debe utilizar.

Pero se ha complicado, algo que no se ve dificil, pero bueno, continuamos en la noche, tengo que irme a trabajar ahora. De todas formas, si usted pudiera hacer una prueba con esto, y ver si es que falta algo mas.


Un Saludo,
Rolando.

oesqueda 16-06-2011 17:16:57

Yo te pediria que nos pusieras el mensaje de error tal cual por favor.

rrosariom 21-06-2011 01:17:51

Crear codigo para acceder a una aplicacion, usando la vista dba_users de oracle
 
hola mis amigos, no habia podido entrar hacer varios dias, para decirle que todavia no he podido hacer una consulta a la base de datos, donde tengo un registro de usuario y clave para llamar un formulario donde pienso crear un menu principal y de ahi deprender todo el proceso de la aplicacion.

ustedes me han ayudado, pero no el codigo que me han facilitado no ha funcionado.

podrian probar ustedes y ver si pueden ver algo que no he podido ver?

Un Saludo,
Rolando.

ecfisa 21-06-2011 04:39:28

Hola Rolando.

Te pido encarecidamente que uses las etiquetas [delphi] [/delphi] cuando incluyas código delphi en tus mensajes para que sean mas intelegibles.
Agregué etiquetas a cuatro mensajes en los que habías incluído código. ;)

En cuanto al error Invalid variant operation:
Código Delphi [-]
  ..
  Form2.adoquery1.Close;
  Form2.AdoQuery1.SQL.Clear;
  Form2.AdoQuery1.SQL.Add('select username,password FROM DBA_USERS');
  Form2.AdoQuery1.SQL.Add('where username = :usuario and password = :clave');
  Form2.AdoQuery1.ParamByName('usuario').AsString:= DBEdit1.Text;
  Form2.AdoQuery1.ParamByName('clave').AsString:= EBEdit2.Text;
  Form2.AdoQuery1.Open;
  if not Form2.adoquery1.IsEmpty then
   Form1.ShowModal
  else
   ShowMessage ('Usuario O PassWord Invalido');
  ...

Saludos. :)

rrosariom 21-06-2011 06:04:38

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.

Neftali [Germán.Estévez] 21-06-2011 10:05:10

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


La franja horaria es GMT +2. Ahora son las 12:35:59.

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