1

これは私がこれまでに持っているものです:

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 がすでに宣言されているというメッセージが表示されます。ポイントは、int 項目のリストを proizvodID 列に挿入する必要があることですが、その列に何度も値を挿入する必要があるため、別のテーブルから取得した narudzbaID 列に何度も変更されない値を挿入する必要があります。最後に追加された値。3 つの列はすべて int で、Session は List int です。asp.net、c#、sql server 2008 を使用。

4

3 に答える 3

3

ループにパラメーターを追加し続けます。2 回目の反復では、@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();
于 2012-09-07T09:08:28.690 に答える
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();
    }
于 2012-09-07T09:18:49.770 に答える
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();
于 2012-09-07T09:08:41.413 に答える