我需要在for loop
中对查询进行参数化,但是VS2013一直告诉我参数已经定义(并且始终指向for循环中的参数)。
为什么会这种情况持续发生?
var query =
"INSERT INTO booking (operator_id, plot_id, postcode, reference) " +
"VALUES (@operator_id, @plot_id, @postcode, @reference);";
for (var i = 0; i < _waypointList.Count; i++)
{
query +=
"INSERT INTO waypoint (booking_id, sequence, address, lat, lng, reference) " +
"VALUES ((select id FROM booking WHERE reference=@reference), " +
"@sequence, @address, @lat, @lng, @reference)";
cmd.Parameters.AddWithValue(("@reference"), _reference);
cmd.Parameters.AddWithValue(("@sequence"), i);
cmd.Parameters.AddWithValue(("@address"), _waypointList[i]);
cmd.Parameters.AddWithValue(("@lat"), _lat);
cmd.Parameters.AddWithValue(("@lng"), _lng);
}
Console.WriteLine(query);
cmd = new MySqlCommand(query, DbConnect.Connection);
cmd.Parameters.AddWithValue(("@operator_id"), _operatorId);
cmd.Parameters.AddWithValue(("@plot_id"), _plotId);
cmd.Parameters.AddWithValue(("@postcode"), _postcode);
cmd.Parameters.AddWithValue(("@reference"), _reference);
cmd.ExecuteNonQuery();
dbConnect.CloseConnection();
答案 0 :(得分:1)
因为您要添加多个具有相同名称的参数。如果_waypoinList有5个元素,你将添加5个参数,包括名称引用,序列,地址,lat和lang。因此你有例外。
我不知道你为什么要这样做,我不明白这段代码的重点,但最简单的解决办法就是在循环的乞讨中调用cmd.Parameters.Clear()
或者你是否想要为循环的每次迭代设置不同的参数,你需要像这样写:
for (var i = 0; i < _waypointList.Count; i++)
{
query +=
@"INSERT INTO waypoint
(booking_id, sequence, address, lat, lng, reference)
VALUES
((select id FROM booking WHERE reference=@reference" + i.ToString() + @"),
@sequence" + i.ToString() + @",
@address" + i.ToString() + @",
@lat" + i.ToString() + @",
@lng" + i.ToString() + @",
@reference" + i.ToString() + ")";
cmd.Parameters.AddWithValue(("@reference" + i.ToString()), _reference);
cmd.Parameters.AddWithValue(("@sequence" + i.ToString()), i);
cmd.Parameters.AddWithValue(("@address" + i.ToString()), _waypointList[i]);
cmd.Parameters.AddWithValue(("@lat" + i.ToString()), _lat);
cmd.Parameters.AddWithValue(("@lng" + i.ToString()), _lng);
}
在这种情况下,您将保证每次迭代都有唯一的参数名称。