1a. Entrega: Novedades en ADO.NET 2.0 - Multiple Active Result Sets


Hola a todos, pues ya estoy de regreso con una entrega más, voy a iniciar una serie de entregas sobre las nuevas características que de ADO.NET 2.0.

Una de las mejoras que vamos a encontrar con la nueva versión de ADO.NET 2.0 es MARS (Multiple Active Result Sets), lo que nos permitirá utilizar múltiples ejecuciones con una misma conexión.

Pero veamos a que se refiere esto, en la versión de ADO.NET 1.1 teníamos un problema, ¿qué pasaba cuando queríamos ejecutar más de una consulta con una misma conexión?

Veamos el siguiente código con ADO.NET 1.1:

string ConnectionString = "Data Source=(local); Initial Catalog=Northwind; Integrated Security=SSPI";
SqlConnection conn = new SqlConnection(ConnectionString);
SqlCommand cmd = new SqlCommand("SELECT * FROM Customers", conn);
SqlDataReader dr;

conn.Open();
dr = cmd.ExecuteReader();
GridView1.DataSource = dr;
GridView1.DataBind();

SqlDataReader = dr2;
SqlCommand cmd2 = new SqlCommand("SELECT * FROM Orders", conn);

dr2 = cmd2.ExecuteReader();
GridView2.DataSource = dr2;
GridView2.DataBind();

conn.Close();

Este código nos provocará un error en tiempo de ejecución "There is already an Open DataReader associated with this Connection which must be close first.", esto es porque cuando ejecutamos el primer DataReader (dr) se mantiene la conexión abierta y se encuentra bloqueada hasta que el cursor se cierre, y esto no nos permitirá ejecutar el segundo DataReader (dr2).

Ahora bien este mismo código funcionará perfectamente con MARS en ADO.NET 2.0 sólo que esta función se encuentra deshabilitada de forma predeterminada, para habilitar MARS debemos de agregar a la cadena de conexión la siguiente propiedad: MultipleActiveResultSets=True

Vemos como quedaría nuestro código:

string ConnectionString = "Data Source=(local); Initial Catalog=Northwind; Integrated Security=SSPI; MultipleActiveResultSets=True";
SqlConnection conn = new SqlConnection(ConnectionString);
SqlCommand cmd = new SqlCommand("SELECT * FROM Customers", conn);
SqlDataReader dr;

conn.Open();
dr = cmd.ExecuteReader();
GridView1.DataSource = dr;
GridView1.DataBind();

SqlDataReader = dr2;
SqlCommand cmd2 = new SqlCommand("SELECT * FROM Orders", conn);

dr2 = cmd2.ExecuteReader();
GridView2.DataSource = dr2;
GridView2.DataBind();

conn.Close();

Otra ventaja que tenemos con MARS es que podemos tener múltiples transacciones porque están ligadas a la ejecución y no a la conexión.

En conclusión vamos a poder realizar varias ejecuciones reutilizando la misma conexión a la base de datos sin la necesidad de crear nuevas conexiones o de abrir y cerrar las conexiones existentes.

Otra cosa que debemos de tomar en cuenta es que cuando utilizamos MARS se crea una sesión lógica en el Cache y nos permitirá tener 10 sesiones de MARS, cuando se llegue al límite de estas sesiones se creará una nueva sesión. Este tipo de sesiones no caducarán, sólo serán eliminadas cuando el objeto conexión sea liberado de memoria, es decir que sea cerrado.

Bueno espero que esto les sea de utilidad. Nos vemos para la siguiente entrega.

S@ludos!
Víctor Alameda
MCSD.NET / INETA LatAm Speaker

Published Saturday, May 26, 2007 8:50 AM por VAlameda

Comentarios

# re: 1a. Entrega: Novedades en ADO.NET 2.0 - Multiple Active Result Sets

Wednesday, September 12, 2007 11:57 AM por edsonyair

Buen artículo

Ofrecido por Community Server (Non-Commercial Edition)