c#如何对列表中的每个项执行非查询?

时间:2017-06-28 21:52:26

标签: c# sql database visual-studio

我的对象" Uitslag"有一个List属性,如何为该列表中的每个项执行非查询。

以下代码会出现此错误:

类型' System.Data.SqlClient.SqlException'未处理的异常发生在System.Data.dll

附加信息:变量名称' @ Partij_ID'已经宣布。变量名在查询批处理或存储过程中必须是唯一的。

 public void AddUitslag(Uitslag uitslag)
    {
        using (SqlConnection connection = Database.Connection)
        {
            VerkiezingRepository VerkiezingRepo = new VerkiezingRepository(new SQLVerkiezingContext());
            string query = "Insert into Uitslag(Naam, Datum, Verkiezing_ID, Partij_ID) values (@Naam, @Datum, @Verkiezing, @Partij_ID)";

            using (SqlCommand command = new SqlCommand(query, connection))
            {
                command.Parameters.AddWithValue("@Naam", uitslag.Naam);
                command.Parameters.AddWithValue("@Datum", uitslag.Datum);
                command.Parameters.AddWithValue("@Verkiezing",  VerkiezingRepo.GetVerkiezing(uitslag.Verkiezing.Naam).ID);

                foreach (Partij p in uitslag.DeelnemendePartijen)
                {
                    command.Parameters.AddWithValue("@Partij_ID", p.Afkorting);

                    command.ExecuteNonQuery();
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

错误是因为你的foreach循环在同一个SqlCommand中创建了具有相同名称的多个参数,这是不允许的。即使您多次执行它,它仍然是相同的SqlCommand对象,您只需继续添加它。

如果您想为每个项目“p”运行一个INSERT,那么在foreach中声明存储库之后,请将所有代码括起来:

public void AddUitslag(Uitslag uitslag)
 {
   using (SqlConnection connection = Database.Connection)
   {
        VerkiezingRepository VerkiezingRepo = new VerkiezingRepository(new SQLVerkiezingContext());
        foreach (Partij p in uitslag.DeelnemendePartijen)
        {
            string query = "Insert into Uitslag(Naam, Datum, Verkiezing_ID, Partij_ID) values (@Naam, @Datum, @Verkiezing, @Partij_ID)";

            using (SqlCommand command = new SqlCommand(query, connection))
            {
                command.Parameters.AddWithValue("@Naam", uitslag.Naam);
                command.Parameters.AddWithValue("@Datum", uitslag.Datum);
                command.Parameters.AddWithValue("@Verkiezing",  VerkiezingRepo.GetVerkiezing(uitslag.Verkiezing.Naam).ID);

                command.Parameters.AddWithValue("@Partij_ID", p.Afkorting);

                command.ExecuteNonQuery();
            }
        }
    }
}