50 - 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:

        Dim descri As String = TextBox1.Text
        Dim precio As String = TextBox2.Text
        Dim cadena As String = "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.

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

alta registros SqlCommand con parametros SQL Server

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

Imports System.Data.SqlClient

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim conexion As SqlConnection
        conexion = New SqlConnection("server=DIEGO-PC ; database=base1 ; integrated security = true")
        conexion.Open()
        Dim cadena As String = "insert into articulos(descripcion,precio) values (@descripcion,@precio)"
        Dim comando As 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 = TextBox2.Text
        comando.ExecuteNonQuery()
        MessageBox.Show("Los datos se guardaron correctamente")
        TextBox1.Text = ""
        TextBox2.Text = ""
        conexion.Close()
    End Sub
End Class

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:

        Dim cadena As String = "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 = 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: BaseDeDatos8 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:

Imports System.Data.SqlClient

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim conexion As SqlConnection
        conexion = New SqlConnection("server=DIEGO-PC ; database=base1 ; integrated security = true")
        conexion.Open()
        Dim cadena As String = "select descripcion, precio from articulos where codigo=@codigo"
        Dim comando As SqlCommand
        comando = New SqlCommand(cadena, conexion)
        comando.Parameters.Add("@codigo", SqlDbType.Int)
        comando.Parameters("@codigo").Value = TextBox1.Text
        Dim registro As SqlDataReader
        registro = comando.ExecuteReader()
        Label4.Text = ""
        Label5.Text = ""
        If registro.Read() = True Then
            Label4.Text = registro("descripcion")
            Label5.Text = registro("precio")
        Else
            MessageBox.Show("No existe un artículo con el código ingresado")
        End If
        conexion.Close()
    End Sub
End Class

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

        Dim cadena As String = "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 = 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:

Imports System.Data.SqlClient

Public Class Form1

    Private conexion As New SqlConnection("server=DIEGO-PC ; database=base1 ; integrated security = true")

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        conexion.Open()
        Dim cadena As String = "select descripcion, precio from articulos where codigo=@codigo"
        Dim comando As SqlCommand
        comando = New SqlCommand(cadena, conexion)
        comando.Parameters.Add("@codigo", SqlDbType.Int)
        comando.Parameters("@codigo").Value = TextBox1.Text
        Dim registro As SqlDataReader
        registro = comando.ExecuteReader()
        If registro.Read() = True Then
            Label4.Text = registro("descripcion")
            Label5.Text = registro("precio")
            Button2.Enabled = True
        Else
            MessageBox.Show("No existe un artículo con el código ingresado")
        End If
        conexion.Close()
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        conexion.Open()
        Dim cadena As String = "delete from articulos where codigo=@codigo"
        Dim comando As SqlCommand
        comando = New SqlCommand(cadena, conexion)
        comando.Parameters.Add("@codigo", SqlDbType.Int)
        comando.Parameters("@codigo").Value = TextBox1.Text
        Dim cant As Integer
        cant = comando.ExecuteNonQuery()
        If cant = 1 Then
            Label4.Text = ""
            Label5.Text = ""
            MessageBox.Show("Se borró el artículo")
        Else
            MessageBox.Show("No existe un artículo con el código ingresado")
        End If
        conexion.Close()
        Button2.Enabled = False
    End Sub
End Class

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: BaseDeDatos10 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:

Imports System.Data.SqlClient

Public Class Form1
    Private conexion As New SqlConnection("server=DIEGO-PC ; database=base1 ; integrated security = true")

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        conexion.Open()
        Dim cadena As String = "select descripcion, precio from articulos where codigo=@codigo"
        Dim comando As SqlCommand
        comando = New SqlCommand(cadena, conexion)
        comando.Parameters.Add("@codigo", SqlDbType.Int)
        comando.Parameters("@codigo").Value = TextBox1.Text
        Dim registro As SqlDataReader
        registro = comando.ExecuteReader()
        If registro.Read() = True Then
            TextBox2.Text = registro("descripcion")
            TextBox3.Text = registro("precio")
            Button2.Enabled = True
        Else
            MessageBox.Show("No existe un artículo con el código ingresado")
        End If
        conexion.Close()
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        conexion.Open()
        Dim cadena As String = "update articulos set descripcion=@descripcion, precio=@precio where codigo=@codigo"
        Dim comando As SqlCommand
        comando = New SqlCommand(cadena, conexion)
        comando.Parameters.Add("@codigo", SqlDbType.Int)
        comando.Parameters("@codigo").Value = TextBox1.Text
        comando.Parameters.Add("@descripcion", SqlDbType.VarChar)
        comando.Parameters("@descripcion").Value = TextBox2.Text
        comando.Parameters.Add("@precio", SqlDbType.Float)
        comando.Parameters("@precio").Value = TextBox3.Text
        Dim cant As Integer
        cant = comando.ExecuteNonQuery()
        If cant = 1 Then
            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")
        End If
        conexion.Close()
        Button2.Enabled = False
    End Sub
End Class

Retornar