%3CLINGO-SUB%20id%3D%22lingo-sub-1477702%22%20slang%3D%22en-US%22%3ELesson%20Learned%20%23130%3A%20Does%20MARS%20work%20in%20Azure%20SQL%20Managed%20Instance%3F%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-1477702%22%20slang%3D%22en-US%22%3E%3CP%3EToday%2C%20we%20worked%20on%20a%20service%20request%20where%20our%20customer%20faced%20the%20following%20error%20message%3A%20%22%3CSTRONG%3EThere%20is%20already%20an%20open%20DataReader%20associated%20with%20this%20Command%20which%20must%20be%20closed%20first%22%3C%2FSTRONG%3E%20performing%20a%20SELECT%20operation%20and%20INSERT%20using%20the%20same%20connection.%26nbsp%3B%20Our%20customer%20asks%20about%20the%20availability%20to%20use%20MARS%20in%20Azure%20SQL%20Managed%20Instance.%20We%20provided%20an%20example%20how%20it%20works%20also%20in%20Azure%20SQL%20Managed%20Instance.%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E1)%20As%20you%20know%20we%20enable%20MARS%20using%20the%20following%20connection%20string%3A%26nbsp%3Bdata%20source%3Dtcp%3Aservername.virtualclustername.database.windows.net%3Binitial%20catalog%3DDataseName%3BUser%20ID%3Dusername%3BPassword%3DPassword%3BConnectRetryCount%3D3%3BConnectRetryInterval%3D10%3BConnection%20Timeout%3D30%3BMax%20Pool%20Size%3D100%3B%3CSTRONG%3EMultipleActiveResultSets%3Dtrue%3C%2FSTRONG%3E%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E2)%20We%20developed%20the%20following%20C%23%20Code%3A%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CPRE%20class%3D%22lia-code-sample%20language-csharp%22%3E%3CCODE%3E%20%20%20%20%20%20%20%20public%20void%20Inicia(int%20nRows%2C%20bool%20bPooling%2C%20bool%20bInstanciaCadaVez%20%3D%20false)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20try%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Stopwatch%20stopWatch%20%3D%20new%20Stopwatch()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stopWatch.Start()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20C.SqlConnection%20oConn%20%3D%20new%20C.SqlConnection()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ClsRetryLogic%20oClsRetry%20%3D%20new%20ClsRetryLogic()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(oClsRetry.HazUnaConexionConReintentos(GetConnectionString(bPooling)%2C%20oConn%2C%20bInstanciaCadaVez))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20C.SqlCommand%20command%20%3D%20new%20C.SqlCommand(%22SELECT%20count(Id)%20FROM%20PerformanceVarcharNVarchar%20Where%20TextToSearch%20%3D%20%40Name%22%2C%20oConn)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20command.CommandTimeout%20%3D%201200%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20command.Parameters.Add(%22%40Name%22%2C%20SqlDbType.VarChar%2C%20200)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20command.Prepare()%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20C.SqlCommand%20command2%20%3D%20new%20C.SqlCommand(%22INSERT%20INTO%20Table_1%20values(%40Name)%22%2C%20oConn)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20command2.CommandTimeout%20%3D%201200%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20command2.Parameters.Add(%22%40Name%22%2C%20SqlDbType.VarChar%2C%20200)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20command2.Prepare()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Random%20rnd%20%3D%20new%20Random()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(int%20tries%20%3D%201%3B%20tries%20%26lt%3B%3D%20nRows%3B%20tries%2B%2B)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine(%22Execution%20Nr.%3A%20%22%20%2B%20tries.ToString())%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20command.Parameters%5B%22%40Name%22%5D.Value%20%3D%20%22Example%20%22%20%2B%20rnd.Next(1%2C%20450338).ToString()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20command2.Parameters%5B%22%40Name%22%5D.Value%20%3D%20rnd.Next(1%2C%20450338)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20C.SqlDataReader%20SqlReaderC%20%3D%20command.ExecuteReader()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20while%20(SqlReaderC.Read())%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine(%22Valor%20%7B0%7D%22%2C%20SqlReaderC.GetValue(0))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20command2.ExecuteNonQuery()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20SqlReaderC.Close()%3B%0A%0A%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oConn.Close()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stopWatch.Stop()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20TimeSpan%20ts%20%3D%20stopWatch.Elapsed%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20string%20elapsedTime%20%3D%20String.Format(%22%7B0%3A00%7D%3A%7B1%3A00%7D%3A%7B2%3A00%7D.%7B3%3A00%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ts.Hours%2C%20ts.Minutes%2C%20ts.Seconds%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ts.Milliseconds%20%2F%2010)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine(%22Object%20type%3A%7B0%7D.%20Time%3A%20%7B1%7D%22%2C%20bPooling%20%3F%20%22Pooling%22%20%3A%20%22without%20Pooling%22%2C%20elapsedTime)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.ReadLine()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20catch%20(Exception%20e)%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine(%22Ups!!%20%22%20%2B%20e.Message)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.ReadLine()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%7D%0A%3C%2FCODE%3E%3C%2FPRE%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3EFinally%2C%20we%20could%20see%20that%20both%20process%20are%20executing%20in%20the%20same%20connection.%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3EEnjoy!!!%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-TEASER%20id%3D%22lingo-teaser-1477702%22%20slang%3D%22en-US%22%3E%3CP%3EToday%2C%20we%20worked%20on%20a%20service%20request%20where%20our%20customer%20faced%20the%20following%20error%20message%3A%20%22%3CSTRONG%3EThere%20is%20already%20an%20open%20DataReader%20associated%20with%20this%20Command%20which%20must%20be%20closed%20first%22%3C%2FSTRONG%3E%20performing%20a%20SELECT%20operation%20and%20INSERT%20using%20the%20same%20connection.%26nbsp%3B%20Our%20customer%20asks%20about%20the%20availability%20to%20use%20MARS%20in%20Azure%20SQL%20Managed%20Instance.%20We%20provided%20an%20example%20how%20it%20works%20also%20in%20Azure%20SQL%20Managed%20Instance.%26nbsp%3B%3C%2FP%3E%3C%2FLINGO-TEASER%3E

Today, we worked on a service request where our customer faced the following error message: "There is already an open DataReader associated with this Command which must be closed first" performing a SELECT operation and INSERT using the same connection.  Our customer asks about the availability to use MARS in Azure SQL Managed Instance. We provided an example how it works also in Azure SQL Managed Instance. 

 

1) As you know we enable MARS using the following connection string: data source=tcp:servername.virtualclustername.database.windows.net;initial catalog=DataseName;User ID=username;Password=Password;ConnectRetryCount=3;ConnectRetryInterval=10;Connection Timeout=30;Max Pool Size=100;MultipleActiveResultSets=true

 

2) We developed the following C# Code:

 

 

 

 

        public void Inicia(int nRows, bool bPooling, bool bInstanciaCadaVez = false)
        {
            try
            {
                Stopwatch stopWatch = new Stopwatch();
                stopWatch.Start();
                C.SqlConnection oConn = new C.SqlConnection();
                ClsRetryLogic oClsRetry = new ClsRetryLogic();
                if (oClsRetry.HazUnaConexionConReintentos(GetConnectionString(bPooling), oConn, bInstanciaCadaVez))
                {

                    C.SqlCommand command = new C.SqlCommand("SELECT count(Id) FROM PerformanceVarcharNVarchar Where TextToSearch = @Name", oConn);
                    command.CommandTimeout = 1200;
                    command.Parameters.Add("@Name", SqlDbType.VarChar, 200);
                    command.Prepare();

                    C.SqlCommand command2 = new C.SqlCommand("INSERT INTO Table_1 values(@Name)", oConn);
                    command2.CommandTimeout = 1200;
                    command2.Parameters.Add("@Name", SqlDbType.VarChar, 200);
                    command2.Prepare();
                    
                    Random rnd = new Random();
                    for (int tries = 1; tries <= nRows; tries++)
                    {
                        Console.WriteLine("Execution Nr.: " + tries.ToString());
                        Console.WriteLine();
                        command.Parameters["@Name"].Value = "Example " + rnd.Next(1, 450338).ToString();
                        command2.Parameters["@Name"].Value = rnd.Next(1, 450338);
                        C.SqlDataReader SqlReaderC = command.ExecuteReader();
                        while (SqlReaderC.Read())
                        {
                            Console.WriteLine("Valor {0}", SqlReaderC.GetValue(0));
                            command2.ExecuteNonQuery();
                        }
                        SqlReaderC.Close();



                    }
                }
                oConn.Close();
                stopWatch.Stop();
                TimeSpan ts = stopWatch.Elapsed;
                string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                    ts.Hours, ts.Minutes, ts.Seconds,
                    ts.Milliseconds / 10);
                Console.WriteLine("Object type:{0}. Time: {1}", bPooling ? "Pooling" : "without Pooling", elapsedTime);
                Console.ReadLine();
            }
            catch (Exception e)
            {
                Console.WriteLine("Ups!! " + e.Message);
                Console.ReadLine();
            }

        }

 

 

 

 

Finally, we could see that both process are executing in the same connection. 

 

Enjoy!!!