ExecuteNonQuery внутри цикла
Я пытаюсь вставить запись в базе данных внутри цикла в C#.
он работает, когда я жестко кодирую такие значения:
string query3 = "INSERT INTO furniture (room_id,member_id) VALUES (222,333);";
SqlCommand cmd3 = new SqlCommand(query3, sqlConnection3);
sqlConnection3.Open();
for (int i = 0; i < arrItemsPlanner.Length; i++)
{
try
{
cmd3.ExecuteNonQuery();
}
catch
{
return "Error: Item could not be saved";
}
finally
{
//Fail
}
}
но когда я использую параметризованные запросы, это не работает-даже если я жестко закодирую значение в параметризованный запрос, как это:
string query3 = "INSERT INTO furniture (room_id,member_id) VALUES (@room_id,333);";
SqlCommand cmd3 = new SqlCommand(query3, sqlConnection3);
sqlConnection3.Open();
for (int i = 0; i < arrItemsPlanner.Length; i++)
{
try
{
cmd3.Parameters.Add("@room_id", System.Data.SqlDbType.Int);
cmd3.Parameters["@room_id"].Value = 222;
cmd3.ExecuteNonQuery();
}
catch
{
return "Error: Item could not be saved";
}
finally
{
//Fail
}
}
кто-нибудь видит, где я иду неправильно здесь?
большое спасибо!
7 ответов
похоже, что вы добавляете в коллекцию параметров команды снова и снова. Очистите его с каждой итерацией.
Я бы также предложил выбросить фактическое исключение, чтобы вы могли видеть, в чем проблема.
Я говорю вам простое решение и наверняка оно работает. Если вы используете параметры в цикле, вам нужно очистить параметры после выполнения запроса. Так что вы можете использовать
cmd3.executeNonQuery();
cmd3.parameters.clear();
Это не проверялось, но должно работать в качестве альтернативы. Просто добавьте его один раз и постоянно обновляйте его значение.
....
cmd3.Parameters.Add("@room_id", System.Data.SqlDbType.Int);
for (int i = 0; i < arrItemsPlanner.Length; i++)
{
try
{
cmd3.Parameters["@room_id"].Value = 222;
cmd3.ExecuteNonQuery();
}
....
кроме того, ваш SqlCommand
должна быть using
блок, а также ваши SqlConnection
. Полный код не отображается, поэтому я не знаю, действительно ли ваше соединение выполняется таким образом.
using (var conn = new SqlConnection(...))
using (var cmd = new SqlCommand(..., conn))
{
}
то, что вы делаете, это добавление итерации цикла параметра ever. В приведенном ниже коде он добавляет параметр один раз и просто изменяет значение одного параметра. Попробуйте это:
string query3 = "INSERT INTO furniture (room_id,member_id) VALUES (@room_id,333);";
SqlCommand cmd3 = new SqlCommand(query3, sqlConnection3);
cmd3.Parameters.Add("@room_id", SqlDbType.Int);
sqlConnection3.Open();
for (int i = 0; i < arrItemsPlanner.Length; i++)
{
try
{
cmd3.Parameters["@room_id"].Value = 222;
cmd3.ExecuteNonQuery();
}
catch
{
return "Error: Item could not be saved";
}
finally
{
//Fail
}
}
Да, не добавляйте параметр в цикл, только установите его значение:
string query3 = "INSERT INTO furniture (room_id,member_id) VALUES (@room_id,333);";
SqlCommand cmd3 = new SqlCommand(query3, sqlConnection3);
sqlConnection3.Open();
cmd3.Parameters.Add("@room_id", System.Data.SqlDbType.Int);
for (int i = 0; i < arrItemsPlanner.Length; i++)
{
try
{
cmd3.Parameters["@room_id"].Value = 222;
cmd3.ExecuteNonQuery();
}
catch
{
return "Error: Item could not be saved";
}
finally
{
//Fail
}
}
cmd3.Parameters.Add("room_id", System.Data.SqlDbType.Int);
// не продолжайте добавлять его в цикл либо
cmd3.Parameters["room_id"].Value = 222;
нет @необходимо в коллекции параметров whne с помощью sql server
другое решение для тех, кто смотрит на эту тему. Создайте два соединения. Один за петлю, а другой, чтобы отправить запросами заявления. Это сработало для меня.