Enlaces e información

Comenta lo que creas oportuno.


Otros posts
Hoy hace un año…
Implementando un proveedor de formularios

Comandos preparados

Escrito por Roberto M. Oliva en Septiembre 29th, 2006

Hay veces que se requiere hacer ejecuciones de sentencias SQL de manera muy repetida, solo cambiando los parametros de dicha sentencia. Si en estos casos generamos un comando preparado, la ejecucion de esas sentencias suele realizarse de una manera más eficaz y rápida.
Un comando preparado es algo similar a un procedimiento almacenado, pero que se ejecuta y se guarda en el lado del cliente.
La idea de un comando preparado es generar la estructura del mismo y dejarlo guardado en la memoria del programa, para utilizarlo en el momento necesario.

Lo primero es definir el comando, teniendo en cuenta cuales son los parametros que pueden variar en las diferentes consultas. Para este ejemplo, he creado una tabla de clientes y vamos a crear un comando preparado que consulte por el nombre de los clientes. Este comando se crearia asi:

1 OleDbCommand oCmd = new OleDbCommand();

2 OleDbCommand oCmd.Connection = CData.Conexion; // Conexion global

3

4 // El parametro es el nombre a buscar

5 oCmd.CommandText = “SELECT * FROM Cliente WHERE Nombre=?”;

6 oCmd.CommandType = CommandType.Text;

Como se puede ver, se pone una ? en vez del valor real del parametro a buscar. A partir de aqui hay que definir los parametros de la consulta. En nuestro caso solo el nombre del cliente. Y agregarselos al objeto comando:


1
// Crear el parametro de busqueda

2 oParam = new OleDbParameter();

3 oParam.ParameterName = “@Nombre”;

4 oParam.DbType = DbType.String;

5 oParam.Size = 50;

6

7 // Anadirselo a la consulta

8 oCmd.Parameters.Add(oParam);

Hasta aqui habriamos definido un comando normal. Este se ejecutaria como cualquier otro comando al especificarle el valor del parametro. Si queremos que se quede preparado para sucesivas consultas, llamaremos al metodo Prepare del comando:

1 // Dejar preparado el comando

2 oCmd.Prepare();

Con esto el comando queda “precompilado” en la memoria de la aplicación y sucesivas llamadas al comando se harán bastante más rápido. Sería conveniente meter el comando preparado en un Singleton, de tal manera que solo se crea una vez y las siguientes se utiliza el creado:

1 public class CComandoBuscarClientes

2 {

3 protected static OleDbCommand _oCmd = new OleDbCommand();

4 public static OleDbCommand Comando

5 {

6 get

7 {

8 if(_oCmd == null)

9 {

10 // Crear el comando

11 // ….

12 // ….

13 }

14 return _oCmd;

15 }

16 }

17 }

Esto tiene como ventaja la expuesta: rendimiento, pero tiene una desventaja que es la ocupación de memoria. Para poder utilizar su version precompilada o preparada hay que dejarlo en memoria. No es que ocupe mucho, pero dependera de la aplicación para saber si esto es viable o no. Es por ello que lo normal no es preparar todos los comandos habidos y por haber en una aplicación, sino solo los que se utilicen con mayor frecuencia y que, por supuesto, solo haya variación en los parámetros entre diferentes ejecuciones.

Para llenar un DataSet con el comando anterior, se haria de la siguiente manera:

1 DataSet ds = new DataSet();

2 OleDbDataAdapter da = new OleDbDataAdapter();

3 da.SelectCommand = CComandoBuscarClientes.Comando;

4 CComandoBuscarClientes.Comando.Parameters[“@Nombre”].Value = “Juan”;

5 da.Fill(ds, “Clientes”);

Como se ve, el comando preparado se utiliza de la misma manera que cualquier otro comando. En este caso especificamos que el parámetro tiene como valor: “Juan”, lo que transformara la consulta en: “SELECT * FROM Cliente WHERE Nombre=’Juan’”. De la misma manera se puede utilizar para obtener escalares, consultas que no devuelvan nada o consultas que devuelven DataReaders.

Por último mencionar que el usar comandos parametrizados (sean preparados o no) tiene muchas ventajas entre las que destaco el que no hay que preocuparse por el tipo en el parámetro de la consulta: No he puesto comillas alrededor de la interrogación en la sentencia SQL y también, en entornos web, es una buena medida de seguridad para evitar la injección de sentencias SQL.



Escriba un comentario

Dediquele un momento a comentar lo que piensa. Esta permitido usar HTML básico para formatear el escrito.

Comentarios de los lectores

esta muy bueno tu aporte, ojala publiques algo relacionado con procedimiento almacenados de SQL Server

wow !!
its very reasonable article.
Good post.
realy gj

thx :-)