【问题标题】:How to implement fifo with conditions in C# and SQL Server?如何在 C# 和 SQL Server 中使用条件实现 fifo?
【发布时间】: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


【解决方案1】:

只需在您的选择查询中使用top 1。同样使用 SQL 参数也很重要。试试看:

...
cmd.CommandText = "select TOP 1 * from stock_recieve where Item_Name like @name order by [Bill No] asc";
cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value =comboBoxitem.Text;
cmd.ExecuteNonQuery();
...

【讨论】:

  • like 实际上是一个等于(与原始相同) - 只是想知道这是故意的还是应该有 %% 围绕它?
  • @johnMcTighe 我也想添加通配符,但将其保留在问题中
  • 如果我在查询中使用 select Top 1 * ,则它不会加载其余相同的产品名称,例如在我的表中,鸡已被保存不止一次,其数量和价格已更改为实施先进先出。
  • 应该有一个 % 围绕它,但我无法让它与代码一起使用,它不会根据组合框给我所有产品名称,我不知道为什么,删除它就行了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 2012-09-17
相关资源
最近更新 更多