1

重複
の可能性: 変数名 '@VarName' は既に宣言されています 問題

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を読み取ってインクリメントしてから、他のすべてを書き込もうとしています。しかし、2 番目のエントリが追加されると、例外が発生します

変数名「@id」は既に宣言されています。変数名は、クエリ バッチまたはストアド プロシージャ内で一意である必要があります。

この例外を回避するにはどうすればよいですか?

4

4 に答える 4

6

毎回同じパラメータを追加すると、常に例外が発生します。

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)";ようなパラメータの値を変更します

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;
于 2012-12-21T14:32:36.440 に答える
4

現在、最初のクエリのパラメーターが 2 番目のクエリのパラメーターと競合しています。実行ごとに新しいコマンドを使用します。

于 2012-12-21T14:22:09.893 に答える
2

ループの反復ごとに 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);
于 2012-12-21T14:23:22.537 に答える
0

@id と他のすべてのパラメーターをパラメーター コレクションに複数回追加しています。最初にコレクションをクリアしてから、新しいレコードを追加する必要があります。

clear メソッドを使用できるはずです。パラメータ収集のクリア

command.Parameters.Clear();
于 2012-12-21T14:23:10.800 に答える