Clase SQLDataSource (ABM - Altas, Bajas y Modificaciones)


Conceptos.

ABM (Altas, Bajas y Modificaciones)

Veremos otra forma de implementar el acceso a Sql Server utilizando una serie de clases que nos facilitan codificar los comandos SQL mediante diálogos administrados por el Visual Studio.

Trabajaremos con la misma base de datos de la clase anterior : base1 y la misma tabla usuarios:

nombre  varchar(30)   Clave primaria
clave	varchar(30)
mail    varchar(30)

Crearemos un sitio web en el Visual Studio llamado ejercicio012.

Crearemos 5 Web Form y les daremos los nombres:

Default.asxp
alta.aspx
consulta.aspx
baja.aspx
modificacion.aspx

La primer página solo tendrá los hipervínculos a otras páginas que tendrán por objetivo efectuar una el alta de usuarios, otra la baja, otra las modificaciones y por último otra la consulta:


Para crear esta interfaz insertaremos cuatro objetos de la clase HyperLink, como mínimo debemos inicializar las propiedades Text (es el texto que mostrará el hipervínculo en el navegador y la propiedad NavigateUrl que indica el nombre de la página que debe cargar el navegador cuando se presione el hipervínculo)

Altas

Activemos desde el Visual Studio la pestaña alta.aspx para elaborar la interfaz visual que nos permita efectuar la carga de datos de usuarios:


Como podemos ver disponemos tres controles de tipo TextBox, el que solicita el ingreso de la clave modificamos la propiedad TextMode con el valor Password, los otros dos los dejamos con el valor SingleLine.
Disponemos un objeto de la clase Button y una Label donde mostraremos un mensaje si el alta se efectuó correctamente.
Por último disponemos un objeto de la clase HyperLink configurando la propiedad NavigateUrl con la dirección de la página principal (Default.aspx)

Conexión con la base de datos

Ahora veremos como crear una conexión con nuestra base de datos que hemos creado desde SQL Server, seleccionamos desde el menú del Visual Studio el "Explorador de servidores"


Seleccionamos la solapa ?Explorador de servidores? y presionamos botón derecho sobre "Conexiones a datos", elegimos la opción ?Agregar conexión?, aparece un ventana de configuración:


Y seguidamente seleccionamos el servidor (lo podemos copiar del Sql Server Management Studio) y la base de datos que trabajaremos:


Debemos seleccionar el nombre del servidor y posteriormente el nombre de la base de datos.
Podemos presionar luego el botón ?Probar conexión? para comprobar la correcta configuración de la conexión.
Presionamos por último el botón ?Aceptar?, veremos luego que aparece en la pestaña del ?Explorador de servidores? la conexión de datos que acabamos de crear. Podemos presionar sobre el signo más que aparece en nuestra conexión y ver que tenemos disponible el acceso a las Tablas, Vistas, Procedimientos almacenados etc. definidos para la base de datos:


Desde el ?explorador de servidores? se puede ver las tablas, campos de una tabla e inclusive si presionamos el botón derecho del mouse sobre la tabla usuarios podemos ver los datos de la misma.

Ahora empezaremos con el alta de usuarios.
Del cuadro de herramientas seleccionamos un control de la clase SqlDataSource (tener en cuenta que está en el grupo ?Datos? y no en el grupo ?Estándar?)

Ahora vemos que nuestro formulario tiene un componente llamado SqlDataSource1 que es de la clase SqlDataSource. Este componente visual no se verá en tiempo de ejecución como veremos más adelante.


Seleccionamos el control SqlDataSource1 del formulario y en la ventana de ?Propiedades? inicializamos la propiedad ConnectionString con el valor que aparece al presionar la pestaña de la derecha (básicamente es la cadena de conexión que creamos anteriormente):


Ahora nos queda configura la propiedad InsertQuery con el comando SQL que nos permite insertar un registro en una tabla.
La propiedad InsertQuery nos abre una ventana de diálogo donde debemos configurar el comando INSERT:


Este diálogo es muy importante ingresar correctamente el comando SQL parametrizando los valores que serán remplazados en tiempo de ejecución con los datos que cargue el operador.
Los parámetros se indican con un nombre antecediéndole el carácter @.
Luego de crear completamente el comando Insert procedemos a presionar el botón "Actualizar parámetros".
Si queremos comprobar si nuestro comando SQL está correcto presionamos el botón "Generador de consultas?" y desde este nuevo diálogo presionamos el botón ?Ejecutar consulta?:


(También desde este diálogo podemos codificar la consulta, probarla y finalmente confirmarla)

Lo que no hay que olvidarse nunca es que cada vez que agregamos o borramos un parámetro de nuestro comando SQL es presionar el botón ?Actualizar parámetros?.

Ahora codificamos el evento clic del botón de alta:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class alta : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        SqlDataSource1.InsertParameters["nombre"].DefaultValue = TextBox1.Text;
        SqlDataSource1.InsertParameters["clave"].DefaultValue = TextBox2.Text;
        SqlDataSource1.InsertParameters["mail"].DefaultValue = TextBox3.Text;
        SqlDataSource1.Insert();
        Label1.Text = "Se efectuó la carga";
        TextBox1.Text = "";
        TextBox2.Text = "";
        TextBox3.Text = "";
    }
}

Al presionar el botón inicializamos los tres parámetros del comando SQL que hemos configurado en el SqlDataSource. Para acceder a dichos parámetros disponemos de la propiedad InsertParameters que le indicamos como subíndice el nombre del parámetro.
Luego de inicializar los tres parámetros procedemos a llamar al método Insert de la clase SqlDataSource.

Como vemos es mucho más limpio que crear directamente aquí el comando SQL como vimos en el concepto anterior.

Consultas

Seleccionamos del Explorador de soluciones la página consulta.aspx y procedemos a elaborar la siguiente interfaz visual (disponemos un TextBox, un Button, una Label, un HyperLink y un SqlDataSoruce:


Configuramos el SqlDataSource1, luego de seleccionarlo con el mouse modificamos la propiedad ConnectionString (con la conexión creada anteriormente) y en el diálogo que abre la propiedad SelectQuery procedemos a codificar el comando select:

select clave,mail from usuarios where nombre=@nombre

Es decir recuperamos la clave y mail de un determinado usuario (recordar de presionar el botón ?Actualizar parámetros)


El código del evento clic es:

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class consulta : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        SqlDataSource1.SelectParameters["nombre"].DefaultValue = TextBox1.Text;
        SqlDataSource1.DataSourceMode = SqlDataSourceMode.DataReader;
        SqlDataReader datos;
        datos = (SqlDataReader)SqlDataSource1.Select(DataSourceSelectArguments.Empty);
        if (datos.Read())
            Label1.Text = "Clave:" + datos["clave"] + "<br>Mail:" + datos["mail"];
        else
            Label1.Text = "No existe un usuario con dicho nombre";
    }
}

Importamos el espacio de nombres SqlClient donde se encuentra la clase SqlDataReader:

using System.Data.SqlClient;

Para poder recuperar los datos mediante un objeto de la clase SqlDataReader debemos configurar el SqlDataSource indicando a la propiedad DataSourceMode el siguiente valor:

        SqlDataSource1.DataSourceMode = SqlDataSourceMode.DataReader;

Ahora cuando llamemos al método select del SqlDataSource lo hacemos con la siguiente sintaxis:

        datos = (SqlDataReader)SqlDataSource1.Select(DataSourceSelectArguments.Empty);

Luego recorremos el SqlDataReader (como este caso puede retornar cero o una fila lo hacemos mediante un if:

        if (datos.Read())

Si el método Read retorna true luego podemos acceder a la fila recuperada con el select.

Bajas

Seleccionamos del Explorador de soluciones la página baja.aspx y procedemos a elaborar la siguiente interfaz visual:


Inicializamos la propiedad ConnectionString del SqlDataSource1 con la conexión que habíamos creado e inicializamos la propiedad DeleteQuery:


Luego el código a ejecutar cuando se presiona el botón ?Borrar? de la página es:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class baja : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        SqlDataSource1.DeleteParameters["nombre"].DefaultValue = TextBox1.Text;
        int cant;
        cant = SqlDataSource1.Delete();
        if (cant == 1)
            Label1.Text = "Se borró el usuario";
        else
            Label1.Text = "No existe dicho nombre";
    }
}

Procedemos a inicializar el parámetro y luego llamamos al método Delete del SqlDataSource. El método Delete retorna un entero y representa la cantidad de filas borradas de la tabla.

Modificaciones

Por último implementaremos la modificación de datos. Seleccionamos del Explorador de soluciones la página modificacion.aspx y procedemos a elaborar la siguiente interfaz visual:


Para efectuar la modificación de datos de un usuario procederemos primero a la búsqueda de los datos actuales. Esto hace que necesitemos un control de la clase SqlDataSource (iniciar primero la propiedad ConnectionString)
El SqlDataSource1 nos permite consultar los datos de un usuario por su nombre y mostrar el resultado en dos controles de tipo TextBox. Definir en la propiedad SelectQuery:

select clave,mail from usuarios where nombre=@nombre

No olvidar actualizar parámetros cuando definimos el comando SQL en el diálogo que configuramos el SelectQuery.

Luego también configuramos la propiedad UpdateQuery:

update usuarios set clave = @clave, mail = @mail where nombre = @nombre

El código para los eventos clic de los dos botones es:

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class modificacion : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Button1_Click(object sender, EventArgs e)
    {

        SqlDataSource1.SelectParameters["nombre"].DefaultValue = TextBox1.Text;
        SqlDataSource1.DataSourceMode = SqlDataSourceMode.DataReader;
        SqlDataReader datos;
        datos = (SqlDataReader)SqlDataSource1.Select(DataSourceSelectArguments.Empty);
        if (datos.Read())
        {
            TextBox2.Text = datos["clave"].ToString();
            TextBox3.Text = datos["mail"].ToString();
        }
        else
            Label1.Text = "No existe un usuario con dicho nombre";
    }

    protected void Button2_Click(object sender, EventArgs e)
    {
        SqlDataSource1.UpdateParameters["nombre"].DefaultValue = TextBox1.Text;
        SqlDataSource1.UpdateParameters["clave"].DefaultValue = TextBox2.Text;
        SqlDataSource1.UpdateParameters["mail"].DefaultValue = TextBox3.Text;
        int cant;
        cant = SqlDataSource1.Update();
        if (cant == 1)
            Label2.Text = "Se modificaron los datos";
        else
            Label2.Text = "No existe dicho codigo de usuario";
    }
}

El método Update de la clase SqlDataSource retorna un entero que indica la cantidad de registros modificados de la tabla (si retorna un 1 significa que un registro fue modificado):

        int cant;
        cant = SqlDataSource1.Update();

Retornar