2013-07-31 5 views
2

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

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 is

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(); 


       } 
+1

что говорит ошибка? –

+0

Ничего, в нем не указано, что есть ошибка. Но в foreach в консоли отображается только первый элемент Словаря. – Exia0890

ответ

2

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

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

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

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

reader.Close(); 
+0

Спасибо за ответ, но это не сработало. – Exia0890

+0

обновленный ответ. пожалуйста, проверьте. – TheProvost

+1

Спасибо, он попросил меня закрыть datareader, выполнив другой запрос, который я сделал. Теперь программа заканчивается, но похоже, что INSERT не работает. – Exia0890

0

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

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

Спасибо за ваш ответ, но если сделать это, он будет вставлять код в каждую строку, есть ли другой способ их выбрать? Я попробую с SET – Exia0890

1

удалить where состояния из вашего следующих insert запроса,

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

Спасибо за ваш ответ, как показано ниже, если это сделает, он будет вставлять код в каждую строку, есть ли другой способ их выбрать? – Exia0890

+0

Оператор insert с VALUES() вставляет одну строку. Если вы не хотите вставлять другую строку, не вызывайте ее. Предложение WHERE ничего не делает. – dbugger

+0

Я вижу, что попробую по-другому. – Exia0890

0

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

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

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

+0

Спасибо за ваши ответы, это так же, как вы сказали ^^. – Exia0890

1

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(); 


       } 
+0

Спасибо за ваш ответ. Да, благодаря TheProvost, ошибка сообщения указала, что мне пришлось закрыть ее. – Exia0890

0

// редактировать ваш оператор выбора попробовать это

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

Можете ли вы добавить еще несколько объяснений? –

+0

Спасибо за ваш ответ, он работает, но это не меняет результат. Инструкция INSERT/или UPDATE не будет работать. – Exia0890

+0

он выполняет несколько команд sql в том же соединении, если вы посмотрите оператор 3 select, он может объединиться в один оператор select –

Смежные вопросы