запуск нескольких команд SqlCommand и ExecuteNonQuery


Я пытаюсь запустить несколько команд SqlCommand в одном и том же соединении, но по какой-то причине программа остановится на втором

command.ExecuteNonQuery();

Вот мой код:

  string queryString = "SELECT DISTINCT Titre from infosHoraire where Salle='DOO';" +
                              "SELECT DISTINCT Titre from infosHoraire where Salle='FOO' and Jour <='" + finDate + "';" +
                              "SELECT DISTINCT Titre from infosHoraire where Salle='GOO' and Jour <='" + finDate + "';";


        using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConsoleXMLtoDB"].ConnectionString))
        {
            SqlCommand command = new SqlCommand(queryString, connection);
            connection.Open();
            SqlDataReader reader = command.ExecuteReader();

            try
            {

                // on remplit le dico
                while (reader.Read())
                {
                    MoviesList.Add(reader[0].ToString(), "0");
                    searchCode(reader[0].ToString(), MoviesList);
                    //Console.WriteLine(" On rajoute le code {0}", MoviesList[reader[0].ToString()]);
                }
                reader.NextResult();
                while (reader.Read())
                {
                    if (!MoviesList.ContainsKey(reader[0].ToString()))
                    {
                        MoviesList.Add(reader[0].ToString(), "0");
                        searchCode(reader[0].ToString(), MoviesList);
                    }

                }
                reader.NextResult();
                while (reader.Read())
                {
                    if (!MoviesList.ContainsKey(reader[0].ToString()))
                    {
                        MoviesList.Add(reader[0].ToString(), "0");
                    }
                }

                foreach (string key in MoviesList.Keys)
                {

                    Console.WriteLine("MoviesList {0}, code {1} .", key, MoviesList[key]);

                    // RAJOUTER DONNEES HORAIRES
                    command.CommandText = "INSERT INTO infosHoraire (Code) VALUES ('" + MoviesList[key] + "') where Titre = '" + key + "'";
                    //cmd.Parameters.AddWithValue("@code", MoviesList[key]);

                    IT STOPS HERE.
                    command.ExecuteNonQuery();


                }



            }
            catch (Exception)
            {
                //Console.WriteLine("{0} Exception caught.", e);
            }
            finally
            {
                // Always call Close when done reading.
                reader.Close();
                connection.Close();
            }
        }

MoviesList - это

  Dictionary<string, string>

Я действительно не могу найти, откуда исходит проблема.

Он будет работать нормально, если я удалю это:

  foreach (string key in MoviesList.Keys)
                {
                    //literaltest.Text += "<br/> dictionnaire " + key + "," + MoviesList[key];
                    Console.WriteLine("MoviesList {0}, code {1} .", key, MoviesList[key]);

                    // RAJOUTER DONNEES HORAIRES
                    command.CommandText = "INSERT INTO infosHoraire (Code) VALUES ('" + MoviesList[key] + "') where Titre = '" + key + "'";
                    //cmd.Parameters.AddWithValue("@code", MoviesList[key]);
                    command.ExecuteNonQuery();


                }
6 2

6 ответов:

Edit: попробуйте поставить точку останова на свой catch и посмотреть, есть ли ошибка.

  catch (Exception e)
        {
            //Console.WriteLine("{0} Exception caught.", e);
        }

Наведите курсор мыши на e, и вы увидите сообщение об ошибке. Затем вставьте его сюда. Это, вероятно, ваш запрос вызывает проблему, а не объект команды

Правка. Объект reader все еще работает, что ограничивает возможность повторного использования объекта command. Закройте считыватель, прежде чем пытаться выполнить следующую команду

reader.Close();

Удалите условие where из следующего запроса insert

command.CommandText = "INSERT INTO infosHoraire (Code) VALUES ('" + MoviesList[key] + "') where Titre = '" + key + "'";

SQLDataReader, который вы использовали для чтения записей, все еще открыт и использует это соединение. Перед выполнением другой команды на том же соединении необходимо закрыть этот считыватель. например

 reader.Close();
foreach (string key in MoviesList.Keys)
                {

                    Console.WriteLine("MoviesList {0}, code {1} .", key, MoviesList[key]);

                    // RAJOUTER DONNEES HORAIRES
                    command.CommandText = "INSERT INTO infosHoraire (Code) VALUES ('" + MoviesList[key] + "') where Titre = '" + key + "'";
                    //cmd.Parameters.AddWithValue("@code", MoviesList[key]);

                    IT STOPS HERE.
                    command.ExecuteNonQuery();


                }

Синтаксис SQL для INSERT и плохо. Вам просто нужно это

querystring= "INSERT INTO infosHoraire (Code) VALUES ('" + MoviesList[key] + "')";

Команда SqlCommand (command) все еще занята - вы не можете повторно использовать ее для инструкции insert. Вам нужно будет открыть новое соединение SqlConnection с новой командой SqlCommand. Хотя, вероятно, было бы чище, если бы вы просто переместили свой foreach за пределы исходных запросов, используя block, Так как в этот момент Вы ссылаетесь только на словарь в памяти.

Как уже упоминалось, ваш оператор insert также содержит предложение where, которое не имеет смысла...возможно, вы имели в виду, что это заявление об обновлении?

Падение пустой улов, и вы увидите некоторые сообщения об исключениях, которые сделают вашу жизнь намного проще.

//отредактируйте инструкцию select попробуйте это

  SELECT DISTINCT Titre from infosHoraire where Salle in ('DOO','FOO','GOO') and Jour <='" + finDate + "'";