84 - SqlCommand : Pasando parámetros


Hemos visto que podemos formar un comando SQL para enviarlo a SQL Server generando un string concatenando los datos que ingresa el operador por teclado:

string cadena = "insert into articulos(descripcion,precio) values ('" + descri + "'," + precio + ")";

Esta metodología tiene el inconveniente cuando hay que elaborar comandos SQL con muchos campos (imaginemos que tenemos que elaborar un insert con una tabla que tiene más de 10 campos)

Para solventar esta dificultad se introduce el concepto de parámetros dentro del comando SQL.

Problema 1

Implementar una interfaz visual para el alta de registros en la tabla artículos utilizando parámetros en el comando insert.

Implementar una interfaz visual para el alta o carga de registros en la tabla artículos.

Crearemos un proyecto llamado "pruebabasedatos7" con la siguiente interfaz visual:

alta registros SqlCommand con parametros SQL Server

El código fuente de la aplicación para efectuar altas es:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Data.SqlClient;

namespace PruebaBaseDatos7
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SqlConnection conexion = new SqlConnection("server=DIEGO-PC\\SQLEXPRESS ; database=base1 ; integrated security = true");
            conexion.Open();
            string cadena = "insert into articulos(descripcion,precio) values (@descripcion,@precio)";
            SqlCommand comando = new SqlCommand(cadena, conexion);
            comando.Parameters.Add("@descripcion", SqlDbType.VarChar);
            comando.Parameters.Add("@precio", SqlDbType.Float);
            comando.Parameters["@descripcion"].Value = textBox1.Text;
            comando.Parameters["@precio"].Value = float.Parse(textBox2.Text);
            comando.ExecuteNonQuery();
            MessageBox.Show("Los datos se guardaron correctamente");
            textBox1.Text = "";
            textBox2.Text = "";
            conexion.Close();
        }
    }
}

Para trabajar con parámetros dentro de comandos SQL debemos disponer el caracter @ y un nombre en los lugares donde se sustituye en tiempo de ejecución con el dato que carga el operador.

En nuestro ejemplo debemos parametrizar la descripción y el precio del artículo:

            string cadena = "insert into articulos(descripcion,precio) values (@descripcion,@precio)";

Es importante notar que no disponemos las camillas simple cuando un parámetro es de tipo varchar. Solo indicamos nombres de parámetros y no tipo de parámetros.

Luego si debemos llamar al método Add de la propiedad Parameters del objeto de la clase SqlCommand indicando cada parámetro y de que tipo se trata (con esto la clase SqlCommand conocerá si tiene que disponer las comillas simples o no):

            comando.Parameters.Add("@descripcion", SqlDbType.VarChar);
            comando.Parameters.Add("@precio", SqlDbType.Float);

Luego que creamos los dos parámetros debemos inicializar sus valores mediante la propiedad Parameters y accediendo como subíndice al nombre de parámetro respectivo:

            comando.Parameters["@descripcion"].Value = textBox1.Text;
            comando.Parameters["@precio"].Value = float.Parse(textBox2.Text);

Finalmente llamamos al método ExecuteNonQuery para enviar al Sql Server el comando Sql respectivo (previamente el objeto comando de la clase SqlCommand se encarga de sustituir los parámetros por los valores asignados y según el tipo de dato del parámetros añadir las comillas simples.

Problema 2

Implementar la consulta de un artículo ingresando por teclado el código y recuperando la descripción y el precio. Definir un parámetro para la consulta

Crear un proyecto llamado: PruebaBaseDatos8 y definir la siguiente interfaz visual:

5 objeto de la clase Label.
1 objeto de la clase Button.
1 objeto de la clase TextBox. 
comando select consulta SqlCommand SQL Server

En el evento Click procedemos a buscar el código del artículo ingresado en el TextBox. El código fuente es:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Data.SqlClient;

namespace PruebaBaseDatos8
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SqlConnection conexion = new SqlConnection("server=DIEGO-PC\\SQLEXPRESS ; database=base1 ; integrated security = true");
            conexion.Open();
            string cadena = "select descripcion, precio from articulos where codigo=@codigo";
            SqlCommand comando = new SqlCommand(cadena, conexion);
            comando.Parameters.Add("@codigo", SqlDbType.Int);
            comando.Parameters["@codigo"].Value = int.Parse(textBox1.Text);
            SqlDataReader registro = comando.ExecuteReader();
            if (registro.Read())
            {
                label4.Text = registro["descripcion"].ToString();
                label5.Text = registro["precio"].ToString();
            }
            else
                MessageBox.Show("No existe un artículo con el código ingresado");
            conexion.Close();
        }
    }
}

Definimos el string con el comando select insertando un parámetro llamado @codigo:

            string cadena = "select descripcion, precio from articulos where codigo=@codigo";

Creamos e inicializamos el parámetro @codigo:

            comando.Parameters.Add("@codigo", SqlDbType.Int);
            comando.Parameters["@codigo"].Value = int.Parse(textBox1.Text);

El resto de la aplicación no cambia con respecto a lo que vimos en conceptos anteriores.

Problema 3

Implementar una aplicación que permita consultar un artículo por su código. Luego de mostrarlo activar un botón para poder eliminarlo. Definir parámetros tanto para la consulta como para el borrado.

Crear un proyecto llamado: PruebaBaseDatos9 y definir la siguiente interfaz visual:

5 objeto de la clase Label.
2 objeto de la clase Button (disponer la propiedad Enabled del 
                             botón de borrado en false para que empiece desactivo)
1 objeto de la clase TextBox. 
comando delete SqlCommand SQL Server

El código fuente para resolver la consulta y borrado es:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Data.SqlClient;

namespace PruebaBaseDatos9
{
    public partial class Form1 : Form
    {
        private SqlConnection conexion = new SqlConnection("server=DIEGO-PC\\SQLEXPRESS ; database=base1 ; integrated security = true");

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            conexion.Open();
            string cadena = "select descripcion, precio from articulos where codigo=@codigo";
            SqlCommand comando = new SqlCommand(cadena, conexion);
            comando.Parameters.Add("@codigo", SqlDbType.Int);
            comando.Parameters["@codigo"].Value = int.Parse(textBox1.Text);
            SqlDataReader registro = comando.ExecuteReader();
            if (registro.Read())
            {
                label4.Text = registro["descripcion"].ToString();
                label5.Text = registro["precio"].ToString();
                button2.Enabled = true;
            }
            else
                MessageBox.Show("No existe un artículo con el código ingresado");
            conexion.Close();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            conexion.Open();
            string cadena = "delete from articulos where codigo=@codigo";
            SqlCommand comando = new SqlCommand(cadena, conexion);
            comando.Parameters.Add("@codigo", SqlDbType.Int);
            comando.Parameters["@codigo"].Value = int.Parse(textBox1.Text);
            int cant;
            cant = comando.ExecuteNonQuery();
            if (cant == 1)
            {
                label4.Text = "";
                label5.Text = "";
                MessageBox.Show("Se borró el artículo");
            }
            else
                MessageBox.Show("No existe un artículo con el código ingresado");
            conexion.Close();
            button2.Enabled = false;
        }
    }
}

Problema 4

Implementar una aplicación que permita consultar un artículo por su código. Luego mostrar en dos TextBox la descripción y el precio actual. Permitir modificar la descripción y precio dejando registrado dicho cambio en la tabla de la base de datos al presionar un botón. Utilizar parámetros en los comandos SQL en la consulta y borrado

Crear un proyecto llamado: PruebaBaseDatos10 y definir la siguiente interfaz visual:

3 objeto de la clase Label.
2 objeto de la clase Button (disponer la propiedad Enabled del 
                             botón de modificación en false para que empiece desactivo)
3 objeto de la clase TextBox. 
comando update SqlCommand SQL Server

El código fuente para resolver la consulta y modificación es:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace PruebaBaseDatos10
{
    public partial class Form1 : Form
    {
        private SqlConnection conexion = new SqlConnection("server=DIEGO-PC\\SQLEXPRESS ; database=base1 ; integrated security = true");

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            conexion.Open();
            string cod = textBox1.Text;
            string cadena = "select descripcion, precio from articulos where codigo=@codigo";
            SqlCommand comando = new SqlCommand(cadena, conexion);
            comando.Parameters.Add("@codigo", SqlDbType.Int);
            comando.Parameters["@codigo"].Value = int.Parse(textBox1.Text);
            SqlDataReader registro = comando.ExecuteReader();
            if (registro.Read())
            {
                textBox2.Text = registro["descripcion"].ToString();
                textBox3.Text = registro["precio"].ToString();
                button2.Enabled = true;
            }
            else
                MessageBox.Show("No existe un artículo con el código ingresado");
            conexion.Close();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            conexion.Open();
            string cadena = "update articulos set descripcion=@descripcion, precio=@precio where codigo=@codigo";
            SqlCommand comando = new SqlCommand(cadena, conexion);
            comando.Parameters.Add("@codigo", SqlDbType.Int);
            comando.Parameters["@codigo"].Value = int.Parse(textBox1.Text);
            comando.Parameters.Add("@descripcion", SqlDbType.VarChar);
            comando.Parameters["@descripcion"].Value = textBox2.Text;
            comando.Parameters.Add("@precio", SqlDbType.Float);
            comando.Parameters["@precio"].Value = float.Parse(textBox3.Text);
            int cant;
            cant = comando.ExecuteNonQuery();
            if (cant == 1)
            {
                MessageBox.Show("Se modificaron los datos del artículo");
                textBox1.Text = "";
                textBox2.Text = "";
                textBox3.Text = "";
            }
            else
                MessageBox.Show("No existe un artículo con el código ingresado");
            conexion.Close();
            button2.Enabled = false;
        }
    }
}

Retornar