1

ドロップダウン リストからの選択に基づいて、テーブルに複数のアイテムを挿入しています。ドロップダウンから 1 つの項目を選択するとすべて正常に動作しますが、複数の項目を選択するとこのエラーが発生します

The variable name '@CompName' has already been declared. Variable names must be unique within a query batch or stored procedure.

私は何を間違っていますか?ありがとうここに私のコードです

protected void DV_Test_ItemInserting(object sender, DetailsViewInsertEventArgs e)
    {
        foreach (ListItem listItem in cblCustomerList.Items)
        {
            if (listItem.Selected)
            {
                string Name= listItem.Value;
                sqlcon.Open();
                string CompName= ((TextBox)DV_Test.FindControl("txtCompName")).Text.ToString();
                string Num = ((TextBox)DV_Test.FindControl("txtNum")).Text.ToString();
                SqlCommand cmd = new SqlCommand("select CompNamefrom MyTable where CompName= '" + CompName+ "' and Num = '" + Num + "' and Name= '" + Name+ "'    ", sqlcon);
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    lblmsg.Text = "Not Valid";
                }
                else
                {
                    dr.Close();

                    sqlcmd.CommandText = "INSERT INTO MyTable(CompName, Num, Name) VALUES(@CompName, @Num, @Name)";
                    sqlcmd.Parameters.Add("@CompName", SqlDbType.VarChar).Value = CompName;
                    sqlcmd.Parameters.Add("@Num", SqlDbType.VarChar).Value = Num;
                    sqlcmd.Connection = sqlcon;                 
                    sqlcmd.ExecuteNonQuery();
                    DV_Test.ChangeMode(DetailsViewMode.Insert);
                    sqlcon.Close();
                }
                sqlcon.Close();               
            }

         }
 }
4

4 に答える 4

5

最後に追加sqlcmd.Parameters.Clear();します。このようにして、各ループの最後にすべてのパラメーターが存在しなくなります。

例:

// ...
sqlcmd.CommandText = "INSERT INTO MyTable(CompName, Num, Name) VALUES(@CompName, @Num, @Name)";
                    sqlcmd.Parameters.Add("@CompName", SqlDbType.VarChar).Value = CompName;
                    sqlcmd.Parameters.Add("@Num", SqlDbType.VarChar).Value = Num;
                    sqlcmd.Connection = sqlcon;                 
                    sqlcmd.ExecuteNonQuery();
                    DV_Test.ChangeMode(DetailsViewMode.Insert);
                    sqlcon.Close();
                    sqlcmd.Parameters.Clear();
//...
于 2013-07-25T09:43:18.433 に答える
5

ループを介して毎回パラメーターをクエリに@CompName追加しています。@Num

呼び出しをAddループの外に移動し、次を使用して更新する必要があります。

sqlcmd.Parameters["@CompName"].Value = CompName;
sqlcmd.Parameters["@Num"].Value = Num;

したがって、コードは次のようになります。

sqlcmd.CommandText = "INSERT INTO MyTable(CompName, Num, Name) VALUES(@CompName, @Num, @Name)";
sqlcmd.Parameters.Add("@CompName", SqlDbType.VarChar);
sqlcmd.Parameters.Add("@Num", SqlDbType.VarChar);

foreach (ListItem listItem in cblCustomerList.Items)
{
    if (....)
    {
        ....
    }
    else
    {
        dr.Close();

        sqlcmd.Parameters["@CompName"].Value = CompName;
        sqlcmd.Parameters["@Num"].Value = Num;
        sqlcmd.Connection = sqlcon;                 
        sqlcmd.ExecuteNonQuery();
        DV_Test.ChangeMode(DetailsViewMode.Insert);
        sqlcon.Close();
    }

}
于 2012-12-13T20:45:52.490 に答える
2

ここでの私の仮定sqlcmdは、ループのスコープ外で宣言したためです。そのため、反復処理を行うと、同じパラメーター名を複数回追加する可能性があります。

そして、この行を修正してください: SqlCommand cmd = new SqlCommand("select CompNamefrom MyTable where CompName= '" + CompName+ "' and Num = '" + Num + "' and Name= '" + Name+ "' ", sqlcon); SQL インジェクションが発生するのを待っているためです。

于 2012-12-13T20:48:59.933 に答える
1

これを追加するだけです:

SqlCmd.Parameters.Clear();

パラメータを追加する前に、コードで。すでに追加されているパラメーター リストをクリアし、パラメーターを新しいものと見なします。

于 2016-09-27T11:46:55.090 に答える