закрытие и открытие DataReader, связанного с командой

string connectionString = ConfigurationManager.ConnectionStrings["myConnection"].ConnectionString;
                const string query = "my Select query here";

                List<long> myList = new List<long>();
                using (SqlConnection con = new SqlConnection(connectionString))
                {
                    con.Open();
                    using (SqlCommand selectCommand = new SqlCommand(query, con))
                    {
                        selectCommand.CommandType = CommandType.Text;
                        SqlDataReader sqlreader = selectCommand.ExecuteReader();

                        while (sqlreader.Read())
                        {
                           long Id = (long)sqlreader["Id"];
                            List.Add(Convert.ToInt32(sqlreader[0].ToString()));

                            using (SqlCommand insertCommand = new SqlCommand("dbo.SP_Data", con))
                             {

                                 insertCommand.CommandType = CommandType.StoredProcedure;
                                 insertCommand.Parameters.Add("@Id", SqlDbType.BigInt).Value = Id;
                                 insertCommand.Parameters.Add("@StatusId", SqlDbType.BigInt).Value = 1;
                                 insertCommand.Parameters.Add("@ReportDate", SqlDbType.DateTime).Value = DateTime.Now;
                                 insertCommand.Parameters.Add("@CreatedDate", SqlDbType.DateTime).Value = DateTime.Now;
                                 insertCommand.Parameters.Add("@CreatedBy", SqlDbType.UniqueIdentifier).Value = DefaultUser();

                                 insertCommand.ExecuteNonQuery();
                             }
                        }
                    }
                }

Я получаю сообщение об ошибке «Уже существует открытый DataReader, связанный с этой командой, который необходимо сначала закрыть.» в последней строке [insertCommand.ExecuteNonQuery();


person StackTrace    schedule 17.02.2014    source источник
comment
Вам необходимо включить MARS в строку подключения (MARS = несколько активных наборов результатов) stackoverflow.com/questions/510899/   -  person Steve    schedule 17.02.2014
comment
@ Стив: спасибо, это все, что мне нужно было сделать. Я приму ваш комментарий как ответ, поэтому опубликуйте его как ответ.   -  person StackTrace    schedule 17.02.2014


Ответы (1)


Вам необходимо включить MARS в строку подключения (MARS = несколько активных наборов результатов)

Короче говоря, этот конкретный флаг, когда он включен в строке подключения, позволяет использовать то же соединение, что и SqlDataReader, также для выполнения команд. В противном случае как указано MSDN соединение занято обслуживанием SqlDataReader и не может выполнять другие команды.
До Sql Server 2005 разработчики были вынуждены создавать, открывать и использовать другое соединение. (Все еще возможно, если ваша среда не позволяет изменять строку подключения)

Более подробную информацию о MARS можно найти на статья MSDN
Примеры строки подключения, использующей MARS

person Steve    schedule 17.02.2014
comment
В случае, если ссылка, показывающая синтаксис, умирает, примером является: Server = myServerAddress; Database = myDataBase; Trusted_Connection = True; MultipleActiveResultSets = true; - person d219; 07.11.2019