запуск нескольких команд 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 ответов:
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, которое не имеет смысла...возможно, вы имели в виду, что это заявление об обновлении?
Падение пустой улов, и вы увидите некоторые сообщения об исключениях, которые сделают вашу жизнь намного проще.