【问题标题】:sql in for loop [duplicate]for循环中的sql [重复]
【发布时间】:2012-12-21 14:20:40
【问题描述】:

可能重复:
The variable name ‘@VarName’ has already been declared Issue

using (SqlCommand command = connection.CreateCommand())
{
    int j = 1;
    for (int i = 0; i < temp4.Count; i++)
    {
        #region idsetter

        int prevId = 0;

        command.CommandText = "SELECT MAX(id) FROM Configuration";
        connection.Open();
        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                if (reader[0].ToString() != "")
                {
                    prevId = Int32.Parse(reader[0].ToString());
                }
                else
                {
                    prevId = 0;
                }
            }
        }

        connection.Close();
        int currId = prevId + 1;
        #endregion
        command.CommandText = "INSERT INTO Configuration (id,A, B, C, D, E, F,G) " + 
                              "VALUES (@id, @a, @b , @c, @d, @e, @f, @g)";

        command.Parameters.AddWithValue("@id", currId);
        command.Parameters.AddWithValue("@a", myL);
        command.Parameters.AddWithValue("@b", pipi);
        command.Parameters.AddWithValue("@c", temp4[i].ad);
        command.Parameters.AddWithValue("@d", temp4[i].asa);
        command.Parameters.AddWithValue("@e", temp4[i].Tasa);
        command.Parameters.AddWithValue("@f", j);
        command.Parameters.AddWithValue("@g", 1);
        connection.Open();
        command.ExecuteNonQuery();
        connection.Close();
        j++;
        if (j > 7)
        {
            j = 1;
        }
    }
}

我正在尝试在配置表中写入,首先读取 id 并增加它,然后再写入其他所有内容。但是当添加第二个条目时,它会给出异常

变量名“@id”已被声明。变量名 在查询批处理或存储过程中必须是唯一的。

如何避免这个异常?

【问题讨论】:

  • 我有 84% 的把握,一旦你设置了一次 CommandText,你就不需要再设置一次了;您可以继续重复使用具有不同参数的语句。您可能希望有两个语句并将它们设置在循环之外,以确保它们不会每次都重新编译。这不是什么大不了的事,但您不妨利用准备好的语句的好处... :)

标签: c# .net sql wpf


【解决方案1】:

如果你每次都添加相同的参数,那么它总是会给你一个异常。

在 for 循环之前声明变量并给它们一些默认值,例如:

command.Parameters.AddWithValue("@id", 1);
command.Parameters.AddWithValue("@a", "");
command.Parameters.AddWithValue("@b", "");
command.Parameters.AddWithValue("@c", "");
command.Parameters.AddWithValue("@d", "");
command.Parameters.AddWithValue("@e", "");
command.Parameters.AddWithValue("@f", 1);
command.Parameters.AddWithValue("@g", 1);

然后把command.CommandText = "INSERT INTO Configuration (id,A, B, C, D, E, F,G) VALUES (@id, @a, @b , @c, @d, @e, @f, @g)";之后的参数值改成like

cmd.Parameters["@id"].Value=currId;
cmd.Parameters["@a"].Value=myL;
cmd.Parameters["@b"].Value=pipi;
cmd.Parameters["@c"].Value=temp4[i].ad;
cmd.Parameters["@d"].Value=temp4[i].asa;
cmd.Parameters["@e"].Value=temp4[i].Tasa;
cmd.Parameters["@f"].Value=j;
cmd.Parameters["@g"].Value=1;

【讨论】:

    【解决方案2】:

    现在,您的第一个查询中的参数与您第二个查询中的参数冲突。每次执行都使用新命令。

    【讨论】:

      【解决方案3】:

      您需要在循环的每次迭代中清除 Command 参数。

      command.CommandText = "INSERT INTO Configuration (id,A, B, C, D, E, F,G) VALUES (@id, @a, @b , @c, @d, @e, @f, @g)";
      
      command.Parameters.Clear();
      command.Parameters.AddWithValue("@id", currId);
      

      【讨论】:

      • 小而简单的解决方案
      【解决方案4】:

      您将@id 和所有其他参数多次添加到参数集合中。您需要先清除集合,然后再添加新记录。

      您应该能够使用 clear 方法。 Clear parameter collection

      command.Parameters.Clear();
      

      【讨论】:

        猜你喜欢
        • 2020-10-18
        • 2019-04-09
        • 2014-01-12
        • 2016-10-04
        • 2016-08-30
        • 1970-01-01
        • 1970-01-01
        • 2020-02-07
        • 2014-03-23
        相关资源
        最近更新 更多