【发布时间】:2018-12-11 22:04:53
【问题描述】:
我选择了多个具有相同产品名称、价格和数量的数据行,并根据它们在数据表中的主键值对其进行排序。但是当我减少库存数量时,它会从所有行中减少。我希望我的代码根据在文本框中输入的用户数量检查库存数量,并仅从第一行减少库存数量。这是我迄今为止能够做到的。提前为错误的格式道歉我是编程和stackoverflow的新手。
数据表有列
Item_Name, Item_Quantity, Item_Price.
代码:
private void btn_save_Click(object sender, EventArgs e)
{
SqlCommand cmd = con.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "select * from stock_recieve where Item_Name like'" + comboBoxitem.Text + "'order by [Bill No] asc";
cmd.ExecuteNonQuery();
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
foreach (DataRow dr in dt.Rows)
{
// DataRow row = dt.Select("Item_Quantity").FirstOrDefault();
dt.Rows[0]["Item_Quantity"]=;
int qty = 0;
string pname = "";
qty = Convert.ToInt32(dr["Item_Quantity"].ToString());
qty = Convert.ToInt32(textBoxqty.Text);
pname = dr["Item_Name"].ToString();
SqlCommand cmd6 = con.CreateCommand();
cmd6.CommandType = CommandType.Text;
cmd6.CommandText = "update stock_recieve set Item_Quantity=Item_Quantity-" + qty + "where Item_Name ='" + pname.ToString() + "'";
cmd6.ExecuteNonQuery();
}
//MessageBox.Show("Record inserted successfully");
}
【问题讨论】:
-
仅供参考 - 您的代码容易受到 SQL 注入攻击。始终在代码中使用参数化查询。
-
您的 UPDATE sql 命令将更新 Item_Name 与 pname 匹配的所有记录 - 选择顶部记录后,您的 UPDATE 记录应在 where 子句中使用“Bill No”(可能与 pname 结合),如果可以的话多于 1 行与票据编号。
-
感谢参数化查询在我的代码中使用它。
-
Bill No 的 PaulF 更新是一个很好的建议,但我可以使用 FirstorDefault() 或任何其他方法从这个数据表 foreach 中获取 Bill No 的第一行(dt.Rows 中的 DataRow dr)。
-
备注:在库存记录中保留金额并在进行库存突变时减少(更新)金额字段实际上是不好的做法。在第二张表中更好地组织您的股票交易。当需要总计时,将库存记录与每种库存项目类型的交易记录连接起来。 Total over transaction 金额:股票交易记录包含一个负数表示取出,一个正数表示接受......事物可以保持不变,并确保可追溯性,因为所有股票交易都被保留。
标签: c# sql sql-server windows winforms