none
AUTENTICAR USUARIO

    Pregunta

  •  

    Hola amigos necesito que me ayuden porfavor les cuento.

    Al momento de validar un usuario ingresando el nombre de usuario y contraseña me arroja el siguiente error.

    Column 'nombreUsuario' does not belong to table empleados.

    La columna 'nombreUsuario' no pertenece a la tabla Empleados. (Error en español)

    Mi forma de validar al usuario la hago de la siguiente forma.

    Este es mi SP. (Base de Datos SQL server 2005)

    CREATE PROCEDURE sp_Login_2
      @nombreUsuario AS VARCHAR(50),
      @contrasena AS VARCHAR(50)
    AS
    
    SET NOCOUNT ON
    
    -- CONSTANTES
    DECLARE @NUMEROMAXIMOINTENTOS       INT
    DECLARE @RESULTADO_USUARIONOEXISTE  INT
    DECLARE @RESULTADO_USUARIOSINCLAVE  INT
    DECLARE @RESULTADO_USUARIOBLOQUEADO INT
    DECLARE @RESULTADO_CLAVEINCORRECTA  INT
    DECLARE @RESULTADO_CLAVECORRECTA    INT
    
    SET @NUMEROMAXIMOINTENTOS       =  3
    SET @RESULTADO_USUARIONOEXISTE  = -1
    SET @RESULTADO_USUARIOSINCLAVE  = -2
    SET @RESULTADO_USUARIOBLOQUEADO = -3
    SET @RESULTADO_CLAVEINCORRECTA  =  0
    SET @RESULTADO_CLAVECORRECTA    =  1
    
    -- Validacion de parametros.
    IF @nombreUsuario IS NULL
    BEGIN
      RAISERROR('Usuario inválido.',16,-1)
      RETURN
    END
    
    IF @contrasena IS NULL
    BEGIN
      RAISERROR('Contraseña inválida.',16,-1)
      RETURN
    END
    
    -- Verifica si el usuario existe.
    IF NOT EXISTS 
    (
      SELECT nombreUsuario
        FROM empleados 
       WHERE nombreUsuario= @nombreUsuario 
    )
    BEGIN
      SELECT @RESULTADO_USUARIONOEXISTE
      RETURN
    END
    
    -- Intentamos obtener la contraseña.
    DECLARE @clave AS VARCHAR(50)
    DECLARE @intentos INT
    
    SELECT @clave = contrasena,
           @intentos = estaBloqueado
      FROM empleados 
     WHERE nombreUsuario= @nombreUsuario
    
    -- Validamos si el usuario esta bloqueado.
    IF @intentos = 0
    BEGIN
      SELECT @RESULTADO_USUARIOBLOQUEADO
      RETURN
    END
    
    -- Validamos la clave.
    IF @clave <> @contrasena
    BEGIN
    
      -- Descuenta el numero de intentos.
      BEGIN TRANSACTION
      
      UPDATE empleados
         SET estaBloqueado = estaBloqueado - 1
       WHERE nombreUsuario = @nombreUsuario
    
      IF @@ERROR <> 0
      BEGIN
        ROLLBACK TRANSACTION
        RAISERROR('Error al actualiza el número de intentos.',16,-1)
        RETURN
      END
    
      COMMIT TRANSACTION  
    
      IF @intentos = 1
      BEGIN
        SELECT @RESULTADO_USUARIOBLOQUEADO
        RETURN
      END
      ELSE
      BEGIN
        SELECT @RESULTADO_CLAVEINCORRECTA
        RETURN
      END
    END
    
    -- Paso todas las validaciones.
    SELECT @RESULTADO_CLAVECORRECTA
    
    SET NOCOUNT OFF
    

     

    Este codigo es el code Behind que esta en el Boton para la validacion (lo que esta en variables de sessio es para los accesos)

    Protected Sub btnEntrar_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnEntrar.Click
        Dim auxNegocio As New NegocioEmpleado
        Dim objLogin As New Empleado
        Dim neg As New NegocioEmpleado
        Dim neg2 As New negocioAcceso
        Dim per As New Empleado
        Dim acc As New Accesos
    
        objLogin = auxNegocio.getLogin(Trim(Me.txtUsuario.Text), (Trim(Me.txtContrasena.Text)))
    
          per = neg.getBuscarPerfil(Me.txtUsuario.Text.Trim)
          acc = neg2.getBuscarAccesos(per.getPerfil_idPerfil)
         
    'Si el nombre de usuario y la contraseña es distinta a 0 el sistema entrara y creara 'la sesion correspondiente para el usuario If objLogin.getNombreUsuario.Length <> 0 And objLogin.getContrasena.Length <> 0 Then Session("nombreUsuario") = Me.txtUsuario.Text Session("frmEmpleado") = acc.getFrmEmpleados() Session("frmPerfil") = acc.getFrmPerfiles() Session("frmAccesos") = acc.getFrmAccesos() Session("frmClientesPar") = acc.getFrmClienteParticular() Session("frmClientesEmpre") = acc.getFrmClienteEmpresa() Session("frmObra") = acc.getFrmObra() Session("frmServicios") = acc.getFrmServicio() Session("frmPresupuesto") = acc.getFrmPresuspuesto() Session("frmEnvioPresupuesto") = acc.getFrmEnviarPresupuesto() Session("frmBodega") = acc.getFrmBodega() Session("frmEntrada") = acc.getFrmEntradas() Session("frmSalida") = acc.getFrmSalidas() Session("frmTraspaso") = acc.getFrmTraspasos() Session("frmInventario") = acc.getFrmInventario() Session("frmAjustes") = acc.getFrmAjustes() Session("frmMateriales") = acc.getFrmMateriales() Session("frmFamilia") = acc.getFrmFamilias() Session("frmSubFamilia") = acc.getFrmSubFamilia() Session("frmConsultaStock") = acc.getFrmConsultaStock() Session("frmConsultaEntradas") = acc.getFrmConsultaEntradas() Session("frmConsultaSalidas") = acc.getFrmConsultaSalidas() Session("frmConsultaTraspaso") = acc.getFrmConsultaTraspaso() Session("frmConsultaInventario") = acc.getFrmConsultaInventario Session("frmConsultaAjustes") = acc.getFrmConsultaAjustes Me.Response.Redirect("frmPrincipal.aspx") Session("acceso") = per.getNombreUsuario Me.Response.Redirect("frmPrincipal.aspx") Else Me.lblMensaje.Text = "Usuario o Contraseña incorrectos" End If End Sub

     

    Por ultimo la funcion que ejecuta la query y la conecion a mi BD

      'FUNCION QUE LOGUEA AL USUARIO
      Public Function getLogin(ByVal txtUsuario As String, ByVal txtContrasena As String) As Empleado
    
        Me.configurarConexion()
    
        Dim objLogin As Empleado
        objLogin = New Empleado
    
        Me.cnn.setSentenciaSQL("EXEC sp_Login_2 " & "@nombreUsuario='" & txtUsuario & "'" & "," & _
                                                    "@contrasena='" & txtContrasena & "'")
    
        Me.cnn.setEsQuery(True)
        Me.cnn.conectar()
    
        objLogin.setNombreUsuario("")
        objLogin.setContrasena("")
    
        Dim fila As Data.DataRow
    
        For Each fila In Me.cnn.getDbDataSet().Tables(Me.cnn.getNombreTabla).Rows
          objLogin.setNombreUsuario(fila("nombreUsuario").ToString) 'AQUI ES DONDE SE ME PRODUCE EL ERROR
          objLogin.setContrasena(fila("contrasena").ToString)
        Next
    
        Me.cnn.cerrarConexion()
        Return objLogin
    
      End Function
    

     

     


    • Editado JonaGuitar martes, 18 de octubre de 2011 13:29
    martes, 18 de octubre de 2011 13:23

Respuestas

  • el tema es que el SP que usas sp_Login_2 si analisas el codigo veras que no devuelve ningun registro de la tabla de empleados, la ultima query que ejecuta es

    SELECT @RESULTADO_CLAVECORRECTA

    por eso falla

    creo que ese sp solo valida si pasa o no la autenticacion, luego deberias ahcer otra query que devuelva el registro con la info del usuario, usando solo el nombre del usuario para buscarlo

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta JonaGuitar jueves, 20 de octubre de 2011 13:06
    martes, 18 de octubre de 2011 15:42

Todas las respuestas

  • hola

    la pregunta casi obligada seria, has valdiado que se llame de esa forma el campo de la tabla empleados  ?

    - has prado ejecutar el SP desde el Sql Server Management Studio ? ejecuta sin problemas ?

    - no uses el EXEC para invocar al SP y usa parametros

    ese metodo setSentenciaSQL() lo unico que ahce es complciarte las cosas, porque no le has dado soporte a parametros

    dos caminos o lo modificas para hacerlo correctamente, o lo descartas por completo

     

    Dim dt As New DataTable()
    
    Using cnn As New SqlConnection("connection string")
    
    	Dim cmd As New SqlCommand("sp_Login_2", cnn)
    	cmd.CommandType = CommandType.StoredProcedure
    
    	cmd.Parameters.AddWithValue("@nombreUsuario ", txtUsuario.Text)
    
    	cmd.Parameters.AddWithValue("@contrasena", txtContrasena.Text)
    
    	Dim da As New SqlDataAdapter(cmd)
    
    	da.Fill(dt)
    End Using
    

    esa es la forma en como deberias invocar al SP, no concatenando el string y suando el EXEC

     

    mira esta charla de secondnug sobere el tema para emjorar tu libreria

    http://social.msdn.microsoft.com/Forums/es-ES/netfxes/thread/760f9f20-18c4-4abd-94f4-ba72e62bebf3

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 18 de octubre de 2011 13:39
  • Leandro muchas gracias por tus consejos los tomare en cuenta.

    Te quiero decir que si he probado mi procedimiento en Sql Server Management Studio y se me ejecuta sin ningun problema

     

    has valdiado que se llame de esa forma el campo de la tabla empleados


    Correcto el campo nombreUsuario de mi tabla empleados se llama de esa forma esta validado ya que como mencione anterirmente al ejecutar mi procedimiento desde el SQL erver Management Studio se me ejecuta sin ningun problema.

     

    martes, 18 de octubre de 2011 13:44
  • entocnes estas seguro que es alli el problema ?

    digo no podria ser en algun otro punto como ser

    getBuscarPerfil()   getBuscarAccesos()

    por ahi en estos accedes a la tabla empleados y se produce el fallo

     

    saludoa


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 18 de octubre de 2011 13:47
  • Leandro en el Codigo que tu me indicas en el comentario anterior

    Using cnn As New SqlConnection("connection string")

    que tengo que colocar en ("connection string") por casualiudad es le nombre de la conexion que tengo declarada en mi web.config

     

    martes, 18 de octubre de 2011 13:49
  • la cadena de conexion que defines para conectarte  a la db

    imagino en algun punto de tu codigo actual usas un SqlConnection, bueno a este le pasas una cadena de conexion, bien esa misma es la que usarias alli

     

    es le nombre de la conexion que tengo declarada en mi web.config

    en realidad el nombre solo no, sino el valor que defines, podrias usar el ConfigurationManager para recuperar esta info

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    martes, 18 de octubre de 2011 13:51
  • Leandro realize lo siguiente, esto lo hice dentro del evento del boton

        'VERIFICAMOS EL USUARIO Y CONTRASEÑA PARA INICIAR SESION
        Using cnn As New SqlConnection(Me.INGRESO.ConnectionString)
          Dim cmd As New SqlCommand("sp_Login_2", cnn)
          cmd.CommandType = CommandType.StoredProcedure
    
          cmd.Parameters.AddWithValue("@nombreUsuario", Me.txtUsuario.Text)
          cmd.Parameters.AddWithValue("@contrasena", Me.txtContrasena.Text)
    
          Dim tabla As New DataTable
          Dim da As New SqlDataAdapter(cmd)
          da.Fill(tabla)
    
          If tabla.Rows.Count > 0 Then
            Session.Add("nombreUsuario", tabla.Rows(0)("nombreUsuario").ToString)
            Session.Add("contrasena", tabla.Rows(0)("contrasena").ToString)
            Me.Response.Redirect("frmPrincipal.aspx")
          Else
            Me.lblMensaje.Text = "Usuario o Contraseña incorrectos "
          End If
        End Using
    

    Me sale el siguiente error:

    The ConnectionString property has not been initialized.

     

    este error me lo arroja en

    da.Fill(tabla)
    

     

    al momento de hacer debug

     

    martes, 18 de octubre de 2011 14:58
  • has validado que

    Me.INGRESO.ConnectionString

    devuelve una cadena de conexion correcta ?

     

    el resto del codigo pareciera esta correcta


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 18 de octubre de 2011 15:02
  • Leandro solucione lo del

    The ConnectionString property has not been initialized.


    al insertar lo siguiente 

    <asp:SqlDataSource ID="INGRESO" runat="server" 
      ConnectionString="<%$  ConnectionStrings:ConstruSoftConnectionString %>" 
      SelectCommand="">
    </asp:SqlDataSource>
    

    Pero ahora me vuelve a salir el mismo problema en la parte

    Session.Add("nombreUsuario", tabla.Rows(0)("nombreUsuario").ToString)

     

    me sale el siguiente error:

    Column 'nombreUsuario' does not belong to table empleados.

     

    el mismo dle principio no se si es el procedimiento que  lo descarto absolutamente porque lo probe en el SQL Server Management Studio y realize todos losposibles casos y me resulto tal como queria 

     

    te pido ayuda porfa es mi teiss lo que estoy reslizando y eso me tiene estancado para la pasar a la segunda fase.

     

    gracias.

     

     

     

     

    martes, 18 de octubre de 2011 15:34
  • el tema es que el SP que usas sp_Login_2 si analisas el codigo veras que no devuelve ningun registro de la tabla de empleados, la ultima query que ejecuta es

    SELECT @RESULTADO_CLAVECORRECTA

    por eso falla

    creo que ese sp solo valida si pasa o no la autenticacion, luego deberias ahcer otra query que devuelva el registro con la info del usuario, usando solo el nombre del usuario para buscarlo

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta JonaGuitar jueves, 20 de octubre de 2011 13:06
    martes, 18 de octubre de 2011 15:42
  • Muchas gracias leandro esa wea la respuesta que andaba buscando me dejaste muy claro gracias. por tus consejos y ayuda asi podre desarrollar de una mejor manera.
    martes, 18 de octubre de 2011 16:00