在SQL插入查询之前在for循环中定义参数时,参数已被定义错误消息

时间:2015-01-30 23:20:30

标签: c# mysql

我需要在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();

1 个答案:

答案 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); 
    }

在这种情况下,您将保证每次迭代都有唯一的参数名称。