Gestión de Usuarios en ASP.NET con VB.NET y SQL Server: Consultar, Modificar, Eliminar y Agregar
Gestión de usuarios en ASP.NET con VB.NET y SQL Server
A continuación se presentan varias páginas de código VB.NET para ASP.NET que implementan las operaciones básicas de CRUD (crear, leer, actualizar y eliminar) sobre una tabla de usuarios en SQL Server, así como el control de acceso mediante autenticación por formularios.
1. Modificar usuario
La clase ModificarUsuario permite buscar un usuario por su correo electrónico y actualizar sus datos.
Imports System.Data.SqlClient
Imports System.Data
Partial Class ModificarUsuario
Inherits System.Web.UI.Page
Protected Sub btnMostrar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnMostrar.Click
Me.lblAviso.Text = ""
' Comprobamos si el usuario ya existe
Using cnn As New SqlConnection(Me.SqlDataSource1.ConnectionString)
' La cadena de selección será la que tenga el DataSource, pero buscando el correo que hemos escrito
'Dim sel As String
'sel = Me.SqlDataSource1.SelectCommand & " WHERE Correo = @Correo"
'Dim cmd As New SqlCommand(sel, cnn)
' Usando un procedimiento almacenado
Dim cmd As New SqlCommand()
cmd.CommandText = "MostrarUsuario"
cmd.CommandType = CommandType.StoredProcedure
cmd.Connection = cnn
' Abrimos la conexión
cnn.Open()
' Añadimos el valor del parámetro de la consulta
cmd.Parameters.AddWithValue("@Correo", txtCorreo.Text)
' El resultado lo guardamos en una tabla
Dim tabla As New DataTable
' Usaremos un DataAdapter para leer los datos
Dim da As New SqlDataAdapter(cmd)
' Llenamos la tabla con los datos leídos
da.Fill(tabla)
' Si la tabla no tiene filas, es que no existe ese usuario
If tabla.Rows.Count = 0 Then
' Avisamos y salimos
Me.lblAviso.Text = "El usuario NO existe"
Exit Sub
End If
' Mostramos los datos que están en la primera fila de la tabla, ya que solo debería haber un solo usuario con ese correo
Me.txtClave.Text = tabla.Rows(0)("Clave").ToString
Me.txtFecha.Text = tabla.Rows(0)("Fecha").ToString
Me.txtNombre.Text = tabla.Rows(0)("Nombre").ToString
Me.txtComentarios.Text = tabla.Rows(0)("Comentarios").ToString
Me.lblAviso.Text = "El usuario existe y se han leído los datos"
' Al salir del bloque Using se cierra la conexión
End Using
End Sub
Protected Sub btnActualizar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnActualizar.Click
Me.lblAviso.Text = ""
' Comprobamos si el usuario ya existe
Using cnn As New SqlConnection(Me.SqlDataSource1.ConnectionString)
' El valor que necesitamos es el ID
Dim cmd As New SqlCommand("SELECT ID FROM Table1 WHERE Correo = @Correo", cnn)
' Abrimos la conexión
cnn.Open()
' Añadimos el valor del parámetro de la consulta
cmd.Parameters.AddWithValue("@Correo", txtCorreo.Text)
' Si devuelve cero, es que no existe
Dim i As Integer
i = CInt(cmd.ExecuteScalar())
If i = 0 Then
' Avisamos y salimos
Me.lblAviso.Text = "El usuario NO existe"
Exit Sub
End If
' Usamos el comando UPDATE del DataSource
cmd = New SqlCommand(Me.SqlDataSource1.UpdateCommand & " WHERE ID = @ID", cnn)
' Añadimos el valor de los parámetros de la consulta
cmd.Parameters.AddWithValue("@Correo", txtCorreo.Text)
cmd.Parameters.AddWithValue("@Clave", txtClave.Text)
cmd.Parameters.AddWithValue("@Fecha", txtFecha.Text)
cmd.Parameters.AddWithValue("@Nombre", txtNombre.Text)
cmd.Parameters.AddWithValue("@Comentarios", txtComentarios.Text)
' El valor de la variable i es el ID a actualizar
cmd.Parameters.AddWithValue("@ID", i)
' Ejecutamos el comando de actualización
cmd.ExecuteNonQuery()
' Al salir del bloque Using se cierra la conexión
End Using
Me.lblAviso.Text = ("Se han actualizado los datos correctamente")
End Sub
End Class
2. Eliminar usuario
La clase EliminarUsuario busca un usuario por correo, muestra sus datos y, posteriormente, los elimina de la base de datos.
Imports System.Data
Imports System.Data.SqlClient
Partial Class EliminarUsuario
Inherits System.Web.UI.Page
Protected Sub btnmostrar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnmostrar.Click
Me.lblAviso.Text = ""
' Comprobamos si el usuario ya existe
Using cnn As New SqlConnection(Me.SqlDataSource1.ConnectionString)
' La cadena de selección será la que tenga el DataSource, pero buscando el correo que hemos escrito
'Dim sel As String
'sel = Me.SqlDataSource1.SelectCommand & _
'"WHERE Correo = @Correo"
'Dim cmd As New SqlCommand(sel, cnn)
'Usando un procedimiento almacenado
Dim cmd As New SqlCommand()
cmd.CommandText = "MostrarUsuario"
cmd.CommandType = CommandType.StoredProcedure
cmd.Connection = cnn
' Abrimos la conexión
cnn.Open()
' Añadimos el valor del parámetro de la consulta
cmd.Parameters.AddWithValue("@Correo", txtCorreo.Text)
' El resultado lo guardamos en una tabla
Dim tabla As New DataTable
' Usaremos un DataAdapter para leer los datos
Dim da As New SqlDataAdapter(cmd)
' Llenamos la tabla con los datos
da.Fill(tabla)
' Si la tabla no tiene filas, es que no existe la persona
If tabla.Rows.Count = 0 Then
' Avisamos y salimos
Me.lblAviso.Text = "El usuario NO existe"
Exit Sub
End If
' Mostramos los datos que están en la primera fila de la tabla, ya que solo debería haber un solo usuario con ese correo
Me.txtClave.Text = tabla.Rows(0)("Clave").ToString
Me.txtFecha.Text = tabla.Rows(0)("Fecha").ToString
Me.txtNombre.Text = tabla.Rows(0)("Nombre").ToString
Me.txtComentarios.Text = tabla.Rows(0)("Comentarios").ToString
Me.lblAviso.Text = "El usuario existe y se han leído los datos"
' Al salir del bloque Using se cierra la conexión
End Using
End Sub
Protected Sub btneliminar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btneliminar.Click
Me.lblAviso.Text = ""
' Comprobamos si el usuario ya existe
Using cnn As New SqlConnection(Me.SqlDataSource1.ConnectionString)
' El valor que necesitamos es el ID
Dim cmd As New SqlCommand(_
"SELECT ID " & _
"FROM Table1 " & _
"WHERE Correo = @Correo", cnn)
' Abrimos la conexión
cnn.Open()
' Añadimos el valor del parámetro de consulta
cmd.Parameters.AddWithValue("@Correo", txtCorreo.Text)
' Si devuelve cero, es que no existe
Dim i As Integer
i = CInt(cmd.ExecuteScalar())
If i = 0 Then
' Avisamos y salimos
Me.lblAviso.Text = "El usuario NO existe"
Exit Sub
End If
' Usamos el comando DELETE del DataSource
cmd = New SqlCommand(Me.SqlDataSource1.DeleteCommand & " WHERE (ID = @ID)", cnn)
' Valores
cmd.Parameters.AddWithValue("@Correo", txtCorreo.Text)
cmd.Parameters.AddWithValue("@Clave", txtClave.Text)
cmd.Parameters.AddWithValue("@Nombre", txtNombre.Text)
cmd.Parameters.AddWithValue("@Fecha", txtFecha.Text)
cmd.Parameters.AddWithValue("@Comentarios", txtComentarios.Text)
' El valor de la variable i es el ID a eliminar
cmd.Parameters.AddWithValue("@ID", i)
' Ejecutamos el comando de eliminación
cmd.ExecuteNonQuery()
' Al salir del bloque Using se cierra la conexión
End Using
txtCorreo.Text = ""
txtClave.Text = ""
txtNombre.Text = ""
txtFecha.Text = ""
txtComentarios.Text = ""
Me.lblAviso.Text = "Se han borrado los datos correctamente"
End Sub
End Class
3. Agregar usuario
La clase AgregarUsuario valida los controles de la página y, si son correctos, inserta un nuevo registro dentro de una transacción, haciendo rollback si se produce un error.
Imports System.Data.SqlClient
Partial Class AgregarUsuario
Inherits System.Web.UI.Page
Protected Sub btnNuevo_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnNuevo.Click
Dim verifica As Object
Dim valida As Boolean = True
Dim strString As String
strString = "Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Act15.mdf;Integrated Security=True;User Instance=True"
For Each verifica In Me.Validators
If verifica.IsValid = False Then
valida = False
End If
Next
If valida = True Then
Using con As New SqlConnection(strString)
' Abrimos la conexión a la base
con.Open()
' Creamos un objeto de transacción
Dim tran As SqlTransaction = con.BeginTransaction
' Creamos un objeto SqlCommand para realizar la inserción de datos
Dim strInsertar As String = "INSERT INTO Table1 VALUES(@Correo, @Clave, @Nombre, @Fecha, @Comentarios)"
Dim cmd As New SqlCommand(strInsertar, con)
' Ingresamos los valores a los parámetros del objeto SqlCommand
cmd.Parameters.AddWithValue("@Correo", txtCorreo.Text)
cmd.Parameters.AddWithValue("@Clave", txtClave.Text)
cmd.Parameters.AddWithValue("@Nombre", txtNombre.Text)
cmd.Parameters.AddWithValue("@Fecha", txtFecha.Text)
cmd.Parameters.AddWithValue("@Comentarios", txtComentarios.Text)
cmd.Transaction = tran
Try
' Ejecutamos el comando INSERT
cmd.ExecuteNonQuery()
' Si la inserción se produce de forma correcta, llamamos al método Commit
tran.Commit()
lblAviso.Text = "Registro agregado"
Catch ex As Exception
' En caso de que se produzca algún error se ejecuta el método Rollback
tran.Rollback()
lblAviso.Text = "Se ha producido el siguiente error: " & ex.Message
End Try
' Cerramos la conexión a la base
con.Close()
End Using
End If
End Sub
End Class
4. Página principal y cierre de sesión
La clase _Default gestiona el cierre de sesión del usuario autenticado y redirige a la página de acceso.
Partial Class _Default
Inherits System.Web.UI.Page
Protected Sub LinkButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LinkButton1.Click
FormsAuthentication.SignOut()
Response.Redirect("login.aspx")
End Sub
End Class
5. Inicio de sesión
La clase login valida las credenciales del usuario contra la base de datos mediante una consulta de conteo con parámetros. Si el usuario existe, se establece la autenticación por formularios.
Imports System.Data.SqlClient
Partial Class login
Inherits System.Web.UI.Page
Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
TextBox1.Text = ""
TextBox2.Text = ""
End Sub
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim strString As String
strString = "Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Act15.mdf;Integrated Security=True;User Instance=True"
Using con As New SqlConnection(strString)
con.Open()
Dim retorno As Integer
Dim tran As SqlTransaction = con.BeginTransaction
Dim sInsert As String = "SELECT COUNT(*) FROM Table1 WHERE (Nombre = @Nombre AND Clave = @Clave)"
Dim cmd As New SqlCommand(sInsert, con)
With cmd
.Parameters.AddWithValue("@Nombre", TextBox1.Text)
.Parameters.AddWithValue("@Clave", TextBox2.Text)
End With
cmd.Transaction = tran
Try
retorno = cmd.ExecuteScalar()
tran.Commit()
Catch ex As Exception
tran.Rollback()
lblAviso.Text = "Error: " & vbCrLf & ex.Message
End Try
If (retorno > 0) Then
FormsAuthentication.RedirectFromLoginPage(TextBox1.Text, False)
Else
lblAviso.Text = "Usuario o contraseña no encontrado"
End If
con.Close()
End Using
End Sub
End Class
6. Procedimiento almacenado MostrarUsuario
Procedimiento almacenado en T-SQL que devuelve los datos de un usuario a partir de su correo electrónico.
ALTER PROCEDURE dbo.MostrarUsuario
@Correo nvarchar(64)
AS
SELECT Correo, Clave, Nombre, Fecha, Comentarios
FROM dbo.Table1
WHERE Correo = @Correo
RETURN
Nota sobre formato de fechas
El patrón de expresión regular \d{2}/\d{2}/\d{4} permite validar fechas con formato dd/mm/aaaa, y puede utilizarse en un control RegularExpressionValidator para verificar el campo de fecha antes de insertar o actualizar registros.