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))
{
}
То, что вы делаете, это добавление параметра в итерацию цикла. В приведенном ниже коде он добавляет параметр один раз и просто изменяет значение одного параметра. Попробуй это:
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;
Нет @needed в коллекции параметров при использовании сервера sql
Еще одно решение для тех, кто смотрит на эту ветку. Создайте два соединения. Один для вашего цикла, а другой для отправки ваших заявлений NonQuery. Это сработало для меня.