将列表保存到数据库

时间:2012-09-07 09:06:06

标签: c# asp.net sql code-behind

这是我到目前为止所做的:

Veza.Open();
SqlCommand zadnjaN = new SqlCommand("SELECT TOP 1 id_n FROM Narudzba ORDER BY id_n DESC", Veza);
var id_zn = zadnjaN.ExecuteScalar(); //get 1 value for id_zn (last one entered)
List<int> proizvodi = new List<int>();
proizvodi = (List<int>)Session["kosarica"];
SqlCommand kupnja1 = new SqlCommand("INSERT INTO NarudzbaItemi ([narudzbaID], [proizvodID]) VALUES (@id_zn, @pro)", Veza);
for (int i = 0; i < proizvodi.Count; i++)
{
  kupnja1.Parameters.AddWithValue("pro", proizvodi[i]); //also tried @pro
  kupnja1.Parameters.AddWithValue("id_zn", id_zn); //@id_zn
  kupnja1.ExecuteNonQuery();
}
Veza.Close();

我收到一条消息,说已经声明了变量名@pro。 关键是,我需要在列proizvodID中插入一个int项列表,但是无论我多次在该列中插入一个值,我需要在列narudzbaID中多次插入一个不变的值,我从另一个表中获取最后一个增值。所有3列都是int,Session是List int。使用asp.net,c#,sql server 2008。

3 个答案:

答案 0 :(得分:3)

您继续在循环中添加参数。在第二次迭代中,@pro 已经已定义。

试试这个:

Veza.Open();
object id_zn; //get 1 value for id_zn (last one entered)
using (SqlCommand zadnjaN = new SqlCommand("SELECT TOP 1 id_n FROM Narudzba ORDER BY id_n DESC", Veza))
{
    id_zn = zadnjaN.ExecuteScalar();
}
List<int> proizvodi = (List<int>)Session["kosarica"];
using (SqlCommand kupnja1 = new SqlCommand("INSERT INTO NarudzbaItemi ([narudzbaID], [proizvodID]) VALUES (@id_zn, @pro)", Veza))
{
    kupnja1.Parameters.Add("pro"); 
    kupnja1.Parameters.Add("id_zn");
    for (int i = 0; i < proizvodi.Count; i++)
    {
        kupnja1.Parameters["pro"].Value = proizvodi[i]; //also tried @pro
        kupnja1.Parameters["id_zn"].Value = id_zn; //@id_zn
        kupnja1.ExecuteNonQuery();
    }
}
Veza.Close();

答案 1 :(得分:1)

在这里你可以做到这一点。但约翰桑德斯的方法我认为更好

    for (int i = 0; i < proizvodi.Count; i++)
    {
        //Add this line to clear parameters
        kupnja1.Parameters.Clear();
        kupnja1.Parameters.AddWithValue("pro", proizvodi[i]); //also tried @pro
        kupnja1.Parameters.AddWithValue("id_zn", id_zn); //@id_zn
        kupnja1.ExecuteNonQuery();
    }

答案 2 :(得分:0)

它基本上是说你不能继续重复使用相同的命令,这应该有效,将声明移动到循环中:

    Veza.Open();
    SqlCommand zadnjaN = new SqlCommand("SELECT TOP 1 id_n FROM Narudzba ORDER BY id_n DESC", Veza);
    var id_zn = zadnjaN.ExecuteScalar(); //get 1 value for id_zn (last one entered)
    List<int> proizvodi = new List<int>();
    proizvodi = (List<int>)Session["kosarica"];

    for (int i = 0; i < proizvodi.Count; i++)
    {
        SqlCommand kupnja1 = new SqlCommand("INSERT INTO NarudzbaItemi ([narudzbaID], [proizvodID]) VALUES (@id_zn, @pro)", Veza);
        kupnja1.Parameters.AddWithValue("pro", proizvodi[i]); //also tried @pro
        kupnja1.Parameters.AddWithValue("id_zn", id_zn); //@id_zn
        kupnja1.ExecuteNonQuery();
    }
    Veza.Close();