ARTICLE

Multiple Active Result Sets (MARS)

Posted by Sudheendra Desai Articles | ADO.NET May 12, 2008
This article gives you information about the Mars a feature supported by MSSqlServer 2005 and .Net 2.0/3.x, which is a feature to execute more than one query with one single connection to database.
Reader Level:
Download Files:
 

Introduction

MARS- Multiple Active Result Sets is a feature supported in sqlserver 2005. In this method having a single connection to database, our applications can execute.

Multiple queries and stored procedures and divides each result of a query or stored procedure as active results. These results are forward-only, read-only data. Previous to MARS, it was required multiple database connections to retrieve data for a separate query or stored procedure, but with in a single connection to database its possible to retrieve all data. This helps your application performance and code management greatly.

In the previous methods each sqlconnection object must be disposed correctly and datareaders associated with each query must be disposed. Otherwise it will lead to some errors like "There is already an open DataReader associated with this Connection- error".

With the introduction of MARS in Sqlserver2005 bye bye to all these problems and performance bottlenecks.

Lets start the Implementation



Settings

You must change your connection string as follows :

String connectionString = "Data Source=TestServer;" +"Initial Catalog=Pubs;IntegratedSecurity=SSPI;" + "MultipleActiveResultSets=True";

MARS is disabled by default on the Connection object. You have to enable it with the addition of MultipleActiveResultSets=true in your connection string.

Program:

This c# code snippet demonstrates the use MARS.

using System.Data;

using System.Data.SqlClient;

 

public class MARSdemo

{

    Public static void Main()

    {

        String MarsConnectionStr="Data Source=TestServer;"+"Initial Catalog=Pubs;IntegratedSecurity=SSPI;" + "MultipleActiveResultSets=True";

        string Mars_Command_Str1="select * from Salary;";

        string Mars_Command_Str2="select * from Employees;";

 

        SqlCommand cmd1 = new SqlCommand(Mars_Command_Str1, MarsConnectionStr);

        SqlCommand cmd2 = new SqlCommand(Mars_Command_Str1, MarsConnectionStr);

        SqlDataReader rdr1 = null;

        SqlDataReader rdr2 = null;

        try

        {

            con.Open();

            rdr1=cmd1.ExecuteReader();

            rdr2=cmd2.ExecuteReader();

        }

        catch (SqlException ex)

        {}

        finally

        {

            if (con.State == ConnectionState.Open)

            {

                con.Close();

            }

            rdr1.Close();

        }

    }
}

If you try to execute this code with sqlserver 2000 or lower versions, u will get an InvalidOperationException and the following error message.

"There is already an open DataReader associated with this Command which must be closed first."

MARS works on the concept of "Multiplexing" and "interleaving". Sql's Select statement is multiplexed enabled statement. These multliplexed enabled statements can pause its execution in between and allow a non-multiplexed statement to execute like INSERT statement.

For example consider you are retrieving 1 million of records using select statement and in between a insert query comes via a MARS enabled application under the same connection object, then select statement pauses until this insert operation completes and afterwards resumes execution.

Note: Managed code (stored procedures, functions, triggers) can't be multiplexed.

COMMENT USING