C# 必须声明标量变量"@“计量单位”;

C# 必须声明标量变量"@“计量单位”;,c#,winforms,C#,Winforms,我有一个windows应用程序,我想填写一份采购订单。它有一个名为uom的字段。现在我使用参数化查询插入。但我得到了这个错误 必须声明标量变量@uom 请帮忙 private void btnsave_Click(object sender, EventArgs e) { con.Open(); if (IsAllValid()) { cmd.CommandText = "insert into purchaseorder(req_no,purchaseo

我有一个windows应用程序,我想填写一份采购订单。它有一个名为uom的字段。现在我使用参数化查询插入。但我得到了这个错误

必须声明标量变量@uom

请帮忙

private void btnsave_Click(object sender, EventArgs e)
{
    con.Open();
    if (IsAllValid())
    {
        cmd.CommandText = "insert into purchaseorder(req_no,purchaseorder_no,purchaseorder_date,costcenter_id,vendor_id,payment_terms,delivery_schedule,emp_id,commercial_name) values(@req_no,@purchaseorder_no,@purchaseorder_date,@costcenter_id,@vendor_id,@payment_terms,@delivery_schedule,@emp_id,@commercial_name)";
        cmd.Parameters.AddWithValue("@req_no", cmbreqno.SelectedValue);
        cmd.Parameters.AddWithValue("@purchaseorder_no", txtpno.Text);
        cmd.Parameters.AddWithValue("@purchaseorder_date", dtpo.Value);
        cmd.Parameters.AddWithValue("@costcenter_id", Convert.ToString(txtcc.Tag));
        cmd.Parameters.AddWithValue("@vendor_id", cmbvendorname.SelectedValue);
        cmd.Parameters.AddWithValue("@payment_terms", txtpaymentterms.Text);
        cmd.Parameters.AddWithValue("@delivery_schedule", txtdeliveryschedule.Text);
        cmd.Parameters.AddWithValue("@emp_id", cmbcontactperson.SelectedValue);
        cmd.Parameters.AddWithValue("@commercial_name", txtcommercial.Text);
        cmd.ExecuteScalar();


        foreach (var item in poitemlist)
        {
            cmd.CommandText = "insert into purchaseorderitem(uom,item_id,quantity,item_cost,total_cost)values(@uom,@item_id,@quantity,@item_cost,@total_cost)";
            cmd.Parameters.AddWithValue("@item_id", item.Item_ID.ToString());
            cmd.Parameters.AddWithValue("@uom", item.uom.ToString());
            cmd.Parameters.AddWithValue("@quantity", item.Quantity.ToString());
            cmd.Parameters.AddWithValue("@item_cost", item.price.ToString());
            cmd.Parameters.AddWithValue("@total_cost", item.TotalCost.ToString());
            cmd.Parameters.Clear();
            cmd.ExecuteScalar();
        }

        MessageBox.Show("Purchase Order saved", "Purchase Order", MessageBoxButtons.OK, MessageBoxIcon.Information);

    }
    else
    {
        MessageBox.Show("error", "Purchase Order", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }


    con.Close();
}

将清除参数集合的行移到ExecuteScalar之后

   cmd.ExecuteScalar();
   cmd.Parameters.Clear();
顺便说一句,如果要插入许多项,最好使用StoredProcedure,或者进行一些优化,将参数的创建移到循环外部,只在循环内部设置值

cmd.Parameters.Clear();
cmd.CommandText = "insert into purchaseorderitem(uom,item_id,quantity,item_cost,total_cost)" + 
                  "values(@uom,@item_id,@quantity,@item_cost,@total_cost)";

// Create the parameters collection with fake values 
// It is better to use the Add with the specific datatype, 
// but for this example I will use AddWithValue
cmd.Parameters.AddWithValue("@item_id", string.Empty);
cmd.Parameters.AddWithValue("@uom", string.Empty);
cmd.Parameters.AddWithValue("@quantity", string.Empty);
cmd.Parameters.AddWithValue("@item_cost", string.Empty);
cmd.Parameters.AddWithValue("@total_cost", string.Empty);
foreach (var item in poitemlist)
{
    cmd.Parameters["@item_id"].Value =, item.Item_ID.ToString();
    cmd.Parameters["@uom"].Value = item.uom.ToString();
    cmd.Parameters["@quantity"].Value = item.Quantity.ToString();
    cmd.Parameters["@item_cost"].Value = item.price.ToString();
    cmd.Parameters["@total_cost"].Value = item.TotalCost.ToString();
    cmd.ExecuteScalar();
}

将清除参数集合的行移到ExecuteScalar之后

   cmd.ExecuteScalar();
   cmd.Parameters.Clear();
顺便说一句,如果要插入许多项,最好使用StoredProcedure,或者进行一些优化,将参数的创建移到循环外部,只在循环内部设置值

cmd.Parameters.Clear();
cmd.CommandText = "insert into purchaseorderitem(uom,item_id,quantity,item_cost,total_cost)" + 
                  "values(@uom,@item_id,@quantity,@item_cost,@total_cost)";

// Create the parameters collection with fake values 
// It is better to use the Add with the specific datatype, 
// but for this example I will use AddWithValue
cmd.Parameters.AddWithValue("@item_id", string.Empty);
cmd.Parameters.AddWithValue("@uom", string.Empty);
cmd.Parameters.AddWithValue("@quantity", string.Empty);
cmd.Parameters.AddWithValue("@item_cost", string.Empty);
cmd.Parameters.AddWithValue("@total_cost", string.Empty);
foreach (var item in poitemlist)
{
    cmd.Parameters["@item_id"].Value =, item.Item_ID.ToString();
    cmd.Parameters["@uom"].Value = item.uom.ToString();
    cmd.Parameters["@quantity"].Value = item.Quantity.ToString();
    cmd.Parameters["@item_cost"].Value = item.price.ToString();
    cmd.Parameters["@total_cost"].Value = item.TotalCost.ToString();
    cmd.ExecuteScalar();
}
删除此行

cmd.Parameters.Clear(); 

删除此行

cmd.Parameters.Clear(); 


为什么定义后要清除所有参数为什么定义错误后要清除所有参数。如果列表中有两项,则需要清除的命令错误。如果列表中有两项,则需要清除cmd.Clear