none
Como obtener valores de una columna de un DataTable? RRS feed

  • Pregunta

  • Tengo una página de Login, lo que yo quiero hacer es guardar una columna llamada s_nombre de mi query y guardarla en una variable session, esto es lo que tengo:

    Protected Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
                   Dim cmd As New SqlCommand("SELECT dbo.USUARIO.i_idficha, dbo.CONTRASENA_USUARIO.s_contrasena, dbo.USUARIO.s_nombre FROM dbo.USUARIO INNER JOIN dbo.CONTRASENA_USUARIO ON dbo.USUARIO.i_idficha = dbo.CONTRASENA_USUARIO.i_ficha WHERE i_idficha = @ficha AND s_contrasena = @pass", cn)
            cmd.CommandType = CommandType.Text
            cmd.Parameters.AddWithValue("@ficha", SqlDbType.Int).Value = txtUser.Text
            cmd.Parameters.AddWithValue("@pass", SqlDbType.VarChar).Value = txtPass.Text
            cn.Open()
            Dim adp As New SqlDataAdapter(cmd)
            Dim table As New DataTable()
    
            adp.Fill(table)
            Dim nombre = table.Rows(0)("s_nombre").ToString()
            If table.Rows.Count <> 0 Then
                If CheckBox1.Checked Then
                    Response.Cookies("FICHA").Value = txtUser.Text
                    Response.Cookies("CONTRASENA").Value = txtPass.Text
    
                    Response.Cookies("FICHA").Expires = DateTime.Now.AddDays(10)
                    Response.Cookies("CONTRASENA").Expires = DateTime.Now.AddDays(10)
                Else
                    Response.Cookies("FICHA").Expires = DateTime.Now.AddDays(-1)
                    Response.Cookies("CONTRASENA").Expires = DateTime.Now.AddDays(-1)
                End If
    
                Session("NOMBRE") = nombre
                Response.Redirect("~/Default.aspx")
            Else
                Panel1.Visible = True
            End If
    
        End Sub

    Lo que hice aquí fue declarar una variable llamada nombre y asignarle el valor de  mi columna de mi consulta, y guardarla en una variable SESSION pero no funciona, el error que me arroja es esto en la línea donde declaro mi variable nombre:

    La cadena no tiene el formato correcto.

    Cómo implemento esto?

    • Cambiado Sergio Parra jueves, 9 de junio de 2016 10:59 pregunta de ado.net
    sábado, 4 de junio de 2016 23:16

Todas las respuestas

  • Isaías Orozco Toledo,

    Si sólo requiere el valor de la columna [s_nombre] que retorna la consulta entonces es innecesario utilizar un objeto DataTable, basta con ejecutar la consulta con el método ExecuteScalar().

    Protected Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
    	Dim cmd As New SqlCommand("SELECT dbo.USUARIO.s_nombre FROM dbo.USUARIO INNER JOIN dbo.CONTRASENA_USUARIO ON dbo.USUARIO.i_idficha = dbo.CONTRASENA_USUARIO.i_ficha WHERE i_idficha = @ficha AND s_contrasena = @pass", cn)
    	
    	cmd.CommandType = CommandType.Text
    	
    	cmd.Parameters.AddWithValue("@ficha", SqlDbType.Int).Value = txtUser.Text
    	cmd.Parameters.AddWithValue("@pass", SqlDbType.VarChar).Value = txtPass.Text
    	
    	cn.Open()
    	
    	Dim nombre As String = cmd.ExecuteScalar()
    
    	If nombre IsNot Nothing Then
    		If CheckBox1.Checked Then
    			Response.Cookies("FICHA").Value = txtUser.Text
    			Response.Cookies("CONTRASENA").Value = txtPass.Text
    
    			Response.Cookies("FICHA").Expires = DateTime.Now.AddDays(10)
    			Response.Cookies("CONTRASENA").Expires = DateTime.Now.AddDays(10)
    		Else
    			Response.Cookies("FICHA").Expires = DateTime.Now.AddDays(-1)
    			Response.Cookies("CONTRASENA").Expires = DateTime.Now.AddDays(-1)
    		End If
    
    		Session("NOMBRE") = nombre
    		Response.Redirect("~/Default.aspx")
    	Else
    		Panel1.Visible = True
    	End If
    End Sub


    sábado, 4 de junio de 2016 23:30
  • Hola Williams, lo que yo quiero hacer es que en mi Login, el usuario teclee su número de ficha y su contraseña en la caja de texto, y que cuando los teclee correctamente se redirija a Default.aspx diciendo "Bienvenido Isaías" por citar un ejemplo

    Intenté lo que comentas pero no funciona, el programa no hace nada amigo.

    Gracias por tomarte tu tiempo.

    domingo, 5 de junio de 2016 0:33
  • Isaías Orozco Toledo,

    Dudo que no haga nada. ¿Ha revisado el contenido de la variable nombre? ¿Los valores que ingresa existen en ambas tablas?

    Ponga un punto de interrupción en la instrucción If para capturar el valor de la variable nombre.

    domingo, 5 de junio de 2016 0:51
  • Hola nuevamente amigo, te respondo porque ya solucioné mi problema y era agregando una línea de código que olvidé escribir, esa línea es:

    Session("FICHA") = txtUser.Text

    Por lo que mi code-behind de mi Login es:

    Protected Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
                    Threading.Thread.Sleep(2000)
            Dim cmd As New SqlCommand("SELECT dbo.USUARIO.i_idficha, dbo.CONTRASENA_USUARIO.s_contrasena, dbo.USUARIO.s_nombre FROM dbo.USUARIO INNER JOIN dbo.CONTRASENA_USUARIO ON dbo.USUARIO.i_idficha = dbo.CONTRASENA_USUARIO.i_ficha WHERE i_idficha = @ficha AND s_contrasena = @pass", cn)
            cmd.CommandType = CommandType.Text
            cmd.Parameters.AddWithValue("@ficha", SqlDbType.Int).Value = txtUser.Text
            cmd.Parameters.AddWithValue("@pass", SqlDbType.VarChar).Value = txtPass.Text
            cn.Open()
            Dim adp As New SqlDataAdapter(cmd)
            Dim table As New DataTable()
            adp.Fill(table)
            If table.Rows.Count <> 0 Then
    
                If CheckBox1.Checked Then
                    Response.Cookies("FICHA").Value = txtUser.Text
                    Response.Cookies("CONTRASENA").Value = txtPass.Text
    
                    Response.Cookies("FICHA").Expires = DateTime.Now.AddDays(10)
                    Response.Cookies("CONTRASENA").Expires = DateTime.Now.AddDays(10)
                Else
                    Response.Cookies("FICHA").Expires = DateTime.Now.AddDays(-1)
                    Response.Cookies("CONTRASENA").Expires = DateTime.Now.AddDays(-1)
                End If
                Dim nombre = table.Rows(0)(2).ToString()
                Session("FICHA") = txtUser.Text
                Session("NOMBRE") = nombre
                Response.Redirect("~/Default.aspx")
            Else
                Panel1.Visible = True
            End If
    
        End Sub

    Gracias por tu ayuda amigo, se aprecia.

    domingo, 5 de junio de 2016 1:15
  • Isaías Orozco Toledo,

    De acuerdo, pero sigo insistiendo que es innecesario que hagas uso de un objeto DataTable si sólo recuperas un valor, te recomiendo que ejecutes la consulta con el método ExecuteScalar() tal y como te sugerí comentarios arriba.

    domingo, 5 de junio de 2016 2:09