Parámetros de SqlCommand y las Variables de SQL Server

Hola ¿Qué tal?


En esta ocasión hablaremos de la manera de utilizar los parámetros en un objeto del tipo SqlCommand y qué es lo que significan estos parámetros del lado del servidor de datos, o sea, Sql Server.


Bien, comencemos por entender cómo se manejan las consultas con variables en SQL Server. En Sql Server se utiliza el lenguaje T-SQL (Transact SQL) que está obviamente basado en el lenguaje SQL-92 además de estar extendido con funcionalidad propia de SQL Server, bien, para programar en SQL Server , ya sea programar Stored Procedures o para simplemente hacer consultas un poco complejas, existe la necesidad de utilizar variables para sustituir los valores en la variable sin modificar el texto de la consulta. En SQL Server las variables se identifican con una arroba como prefijo del nombre de la variable. Tiene ciertas características el uso de variables en T-SQL, creo que es necesario entender esto antes de poder continuar con el uso de parámetros, será breve.


Declaración y Uso de Variables de T-SQL en SQL Server


La declaración de variables en SQL Server utilizando T-SQL es simple, se utiliza la instrucción Declare para indicar que se está declarando una variable, después se pondrá el nombre de la variable con una arroba como prefijo, después del nombre irá el tipo de dato, este tipo de dato es el mismo que se utiliza en la definición de los campos de una tabla de SQL Server. El siguiente es un ejemplo de declaración de una variable del tipo Varchar de 20 caracteres de longitud.


Declare @Nombre Varchar(20)


La longitud de caracteres está definida entre paréntesis a continuación del tipo de dato.


El mecanismo para asignar un valor inicial a la variable se hace de dos maneras, una es con la instrucción Set si es que se quiere asignar el valor directamente y la otra es con la instrucción Select si se quiere asignar la variable con un valor consultado de alguna tabla. Veamos algunos ejemplos de esto:

–Ejemplo Asiganción con Set
Declare
@Nombre Varchar(20)Set
@Nombre = ‘Pépe Papas’
 
–Ejemplo Asiganción con Select
Declare
@Nombre Varchar(20)
Select @Nombre = Nombre from Clientes where IdCliente = 12
 

De esta manera es como se asignan valores a una variable de T-Sql, ahora bien, si queremos utilizar esta variable para pasar valores a una consulta o instrucción, lo haríamos sustituyendo el valor fijo por el nombre de la variable, así, podríamos variar los valores en la variable y mantener la consulta o la instrucción SQL sin cambios. Veamos un ejemplo de uso:

–Ejemplo Select con Variables
Declare @Nombre Varchar(20)
Set @Nombre = ‘José’
 
Select * From Empleados Where Nombre = @Nombre
 
–Ejemplo Update con Variables
Declare @IdEmpleado int
Declare @Sueldo Money
Set @IdEmpleado = 12
Set @Sueldo = 1000
 
Update Empleado Set Sueldo = @Sueldo Where IdEmpleado = @IdEmpleado


Pero seguro se preguntarán qué razón tendría utilizar variables si se pueden utilizar los valores directamente en la consulta, para este caso, pues ninguna ya que en este caso si se trata de consultas de prueba en la consola de consultas de SQL Server pues es mejor utilizar los valores directamente, sin embargo, cuando hablamos de Stored Procedures o de instrucciones incluidas en un Cursor o en un ciclo donde los valores cambian a cada vuelta o cambian por el paso de valores, pues ahí sí tendría sentido.


Ahora que ya entendemos un poco el significado de las variables en T-SQL, pensemos en nuestras aplicaciones de .NET. En las aplicaciones que utilizan consultas e instrucciones de SQL utilizando objetos de acceso a datos desde aplicaciones de web o Windows, ha sido práctica común utilizar una cadena de caracteres para definir las consultas y las instrucciones y se ha utilizado la concatenación para armar estas cadenas. Supongamos que queremos realizar la primer consulta desde nuestra aplicación, ¿Cómo podríamos pasar eso a una aplicación .NET?, bien, la manera típica y popularizada se muestra a continuación.


Suponiendo que se tiene un TextBox llamado txtNombre que será utilizado para tomar el valor del nombre y un objeto SqlConnection declarado con el nombre cnn y previamente inicializado se tiene lo siguiente:


En VB.NET

Dim cmd As System.Data.SqlClient.SqlCommand
cmd = New System.Data.SqlClient.SqlCommand()
cmd.Connection = cnn
cmd.CommandText = _
    “Select * From Empleados Where Nombre = ‘” & txtNombre.Text & “‘”
cmd.ExecuteNonQuery()


En C#

System.Data.SqlClient.SqlCommand cmd;
cmd = new System.Data.SqlClient.SqlCommand();
cmd.Connection = cnn;
cmd.CommandText =
    “Select * From Empleados Where Nombre = ‘” + txtNombre.Text + “‘”;
cmd.ExecuteNonQuery();

La práctica de utilizar la concatenación como en el ejemplo anterior no es buena y es considerada de alto riesgo en seguridad pues está expuesta a ser fácilmente atacada con inyección de SQL, que es el principal motivo para no hacerlo de esta manera. Y entonces, ¿cómo puedo hacerlo?, pues utilizando variables de SQL y por otra parte, utilizando los parámetros de SqlCommand. En la siguiente sección veremos con detalle su uso.


Los parámetros en SqlCommand


La clase SqlCommand define una propiedad de colección llamada Parameters, en esta propiedad se almacenan los valores para los parámetros utilizados en una instrucción o consulta de SQL que ha sido asignada como cadena de caracteres a la propiedad CommandText de un SqlCommand. Estos parámetros son del tipo SqlParameter y están directamente relacionados con las variables utilizadas en las instrucciones o consultas T-SQL, como en el ejemplo de la consulta mostrado anteriormente, donde definimos una variable para sustituir los valores fijos. Aprovecharemos la ventaja de utilizar variables de T-SQL combinada con las ventajas de utilizar parámetros de SqlCommand. Veamos estas ventajas.


La ventaja de utilizar las variables de T-SQL en la cadena de la consulta, nos permiten tener una cadena de caracteres uniforme y similar a lo que se usa directamente con T-SQL, estas variables también pueden ser los parámetros de un procedimiento almacenado.


La ventaja de utilizar un SqlParameter es que la variable de T-SQL será del tipo que dice ser, y en su caso, tendrá la longitud que espera. Al pasar los valores de un SqlParameter a una variable T-SQL definida para nuestra consulta se estarán disminuyendo los riesgos por un ataque de inyección de SQL, ya que el valor que se pase del parámetro será almacenado en la variable y la consulta no se verá afectada en su estructura de ejecución.


Estas son algunas ventajas además de que es más eficiente utilizar parámetros al momento de depurar o de dar mantenimiento al código.


El uso de parámetros es realmente simple, sin embargo hay varias maneras de utilizarlos, una sería la manera larga, o con más código, donde declaramos primeramente nuestro SqlParameter para después inicializarlo y configurarlo y para luego agregarlo a la colección de parámetros del SqlCommand. La manera larga se muestra en el siguiente ejemplo:


En VB.NET

Dim cmd As System.Data.SqlClient.SqlCommand
cmd = New System.Data.SqlClient.SqlCommand()
cmd.Connection = cnn
cmd.CommandText = _
    “Select * From Empleados Where Nombre = @Nombre”
 
Dim param As System.Data.SqlClient.SqlParameter
param = New System.Data.SqlClient.SqlParameter()
param.ParameterName = “@Nombre”
param.SqlDbType = SqlDbType.VarChar
param.Size = 20
param.Value = txtNombre.Text
 
cmd.Parameters.Add(param)
cmd.ExecuteNonQuery()
 
En C#

System.Data.SqlClient.SqlCommand cmd;
cmd = new System.Data.SqlClient.SqlCommand();
cmd.Connection = cnn;
cmd.CommandText =
    “Select * From Empleados Where Empleado = @Nombre”;
 
System.Data.SqlClient.SqlParameter param;
param = new System.Data.SqlClient.SqlParameter();
param.ParameterName = “@Nombre”;
param.SqlDbType = SqlDbType.VarChar;
param.Size = 20;
param.Value = txtNombre.Text;
 
cmd.Parameters.Add(param);
cmd.ExecuteNonQuery();
 

Este ejemplo utiliza un objeto SqlConnection creado previamente con la configuración de la base de datos a utilizar.


El ejemplo anterior es para mostrar los elementos que participan en un parámetro SqlParameter, podemos ver el ParameterName, que es el nombre de la variable utilizada en la consulta, este nombre debe coincidir con el de la variable que apunta en el CommandText, también está el SqlDbType, que es un enumerador que nos sirve para indicar el tipo de dato de la variable que se va a utilizar, a continuación vemos Size, que es el tamaño de la variable en bytes, y la final, vemos Value, que es el valor que será asignado a la variable para se pasado en la consulta definida en el CommandText. Una vez que se asignaron estas propiedades, se agrega el parámetro a la colección Parameters del SqlCommand.


La manera más corta de agregar un SqlParameter a la colección parameters de un SqlCommand es en una línea, donde se define todo al momento que se está agregando. A continuación pondré el mismo ejemplo, pero ahora de la manera corta, espero que encuentren la analogía. Esta manera es la más práctica si se están agregando varios parámetros de una consulta. Veamos:

Para VB.NET

Dim cmd As System.Data.SqlClient.SqlCommand
cmd = New System.Data.SqlClient.SqlCommand()
cmd.Connection = cnn
cmd.CommandText = _
    “Select * From Empleados Where Nombre = @Nombre”
 
cmd.Parameters.Add( _
    “@Nombre”, SqlDbType.VarChar, 20).Value = txtNombre.Text
cmd.ExecuteNonQuery()

Para C#

System.Data.SqlClient.SqlCommand cmd;
cmd = new System.Data.SqlClient.SqlCommand();
cmd.Connection = cnn;
cmd.CommandText =
    “Select * From Empleados Where Empleado = @Nombre”;
 
cmd.Parameters.Add(
    “@Nombre”, SqlDbType.VarChar, 20).Value = txtNombre.Text;
cmd.ExecuteNonQuery();


En este ejemplo vemos el uso de una de las sobrecargas del método Add() de la propiedad de colección Parameters. El uso de parámetros con un stored procedure es similar, solo debemos tener consideración del nombre del párametro que toma el Stored Procedure para que no cause un error.


Bien con esto tenemos ya la manera de utilizar los parámetros y su relación con T-SQL, en resumen, un SqlParameter define las características de una variable de T-SQL. Espero que sea de utilidad.


Saludos…


Octavio Telis

20 thoughts on “Parámetros de SqlCommand y las Variables de SQL Server”

  1. Esta muy bueno el articulo, sobre todo por que los ejemplos hacen que se comprenda de manera mas clara

  2. GRACIAS POR COMPARTIR TUS CONOSIMIENTOS CON LOS DEMAS… ME SIRVIO MUCHO. SEGUI ASI QUE MUCHA GENTE AUNQUE NO TE LO AGRADECE CON LETRAS EN ESTA PAGUINA, TE AGRADECERA DE Y RECORDARA DE OTRAS MANERAS.

  3. es cierto..esta buenisimo todo para lo que estamos comenzando con el tema de los procedimiento almacenados…gracias..!!

  4. buenazo sinceranmente deben haber mas personas como tu k transmitan sus conocimientos chevere te pasastes ….XD

  5. Me sorprende la forma tan pedagógica de presentar el tema. Muchas gracias por esa claridad y profunda simpleza.
    Saludos desde Medellín, Colombia.

  6. hola, y como hago si tengo dos parametros?, inicializo las variables del segundo, tercero, etc parametro y lo hago copiando el codigo del primero?

  7. Los parámetros los agregas a una colección de parámetros, por lo que si tu instrucción SQL contiene dos o más parámetros, será el mismo tanto de parámetros que agregues en la colección SqlCommand.Parameters de tu objeto SqlCommand. Los parámtros subsecuentes se agregan de manera análoga a lo descrito en el artículo.

    Saludos…

    Octavio Telis

  8. la verdad es que muy buena esta explicacion, pase mucho tiempo buscando y al fin halle aqui lo que estaba buscando. Muchas gracias.

  9. Grandeeeeeeeeeeeeeeee. gente como tu vale a pena conocer, por usted una cerveza.

    la informacion muy apropiada. yo estoy en mis inicios y lo encontre muy buena la info.

  10. Muchas gracias por compartir la información. Una consulta, tengo un mantenimiento de 20 campos y resultan muchas lineas tener que poner los 20 parámetros. ¿hay alguna forma de evitar tantas lineas de código?. Gracias.

  11. Excelente, muy bien explicado, me ha servido mucho y es lo único que logró funcionar con mi código. ¡Brillante!

  12. Excelente explicación. Una pregunta si el resultado como lo ves retorna un conjunto de registros como lo manejo si el execnonquery ?

  13. Buenas Tardes
    Excelente explicacion, quisiera saber que con este proceso retornaria un conjunto de registros, pero con el execnonquery no los trae , como los enlazo a una table o un dataset

  14. Hola Ricardo, pues mira, en este atículo (http://bit.ly/NjYa6k), que está aquí, en este blog. Bueno, en ese articulo tengo una explicación de cómo pasar el resultado de una consulta en un DataTable, en específico, es un método llamado GetQuery, es parte de toda una clase, pero básicamente, es usar un DataAdapter, un Command y un DataTable. Espero que encuentres ahí una respuesta a lo que estás buscando.

Leave a Reply

Your email address will not be published. Required fields are marked *


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>