在 SQL 中减少值,但在 C# 中不为负值

问题描述 投票:0回答:1

我想从产品减少面板减少数据库中我的产品数量。但如果输入的数字大于我的产品数量,即数量减少并变为负数,我希望它给出错误。我找不到这个决策机制和必要的命令,你能帮助我吗?

我的意思是我想减少数字(产品数量),但我不希望数字(产品数量)变为负数。当输入大于金额时,我想给出一个错误,例如“我们没有足够的产品!”

我就是这样尝试的

string constr = ConfigurationManager.ConnectionStrings["stok"].ConnectionString;
SqlConnection con = new SqlConnection(constr);
SqlCommand cmda;
SqlCommand cmdb;
con.Open();

SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM urunler WHERE barkod = '" + barkod.Text + "'", con);
SqlDataAdapter db = new SqlDataAdapter("SELECT * FROM urunler WHERE adet >= '0' AND barkod = '" + barkod.Text + "'", con);
DataSet ds = new DataSet();
DataSet dl = new DataSet();
da.Fill(ds);
db.Fill(dl);

if (ds.Tables[0].Rows.Count > 0)
{
    cmda = new SqlCommand("UPDATE urunler SET cikarTarih='" + cikarTarih.Text + "'WHERE barkod='" + barkod.Text + "'", con);
    cmdb = new SqlCommand("UPDATE urunler SET adet=adet-1 WHERE barkod='" + barkod.Text + "'", con);

    for (int i = Convert.ToInt32(adet.Text); i > 0 ; i--)
    {
        cmdb.ExecuteNonQuery();
        if (dl.Tables[0].Rows.Count < 0)
        {
            ClientScript.RegisterClientScriptBlock(this.GetType(), "K", "swal('Hata', 'Ürün adedi yeterli değil!', 'error')", true);
        }
    }
    cmda.ExecuteNonQuery();
    ClientScript.RegisterClientScriptBlock(this.GetType(), "K", "swal('İşlem Tamamlandı', 'Ürün adedi başarıyla güncellendi!', 'success')", true);
}
else
{
    ClientScript.RegisterClientScriptBlock(this.GetType(), "K", "swal('Hata', 'Aradığınız ürün bulunamadı!', 'error')", true);
}

con.Close();

这是我的解决方案!

string constr = ConfigurationManager.ConnectionStrings["stok"].ConnectionString;
SqlConnection con = new SqlConnection(constr);
SqlCommand cmda;
SqlCommand cmdb;
con.Open();

SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM urunler WHERE barkod = '" + barkod.Text + "'", con);
SqlDataAdapter db = new SqlDataAdapter("SELECT * FROM urunler WHERE adet >='" + Convert.ToInt32(adet.Text) + "'AND barkod = '" + barkod.Text + "'", con);
DataSet ds = new DataSet();
DataSet dl = new DataSet();
da.Fill(ds);
db.Fill(dl);

if (ds.Tables[0].Rows.Count > 0)
{
    if (dl.Tables[0].Rows.Count > 0)
    {
        cmda = new SqlCommand("UPDATE urunler SET cikarTarih='" + cikarTarih.Text + "'WHERE barkod='" + barkod.Text + "'", con);
        cmdb = new SqlCommand("UPDATE urunler SET adet=adet-1 WHERE barkod='" + barkod.Text + "'", con);

        for (int i = Convert.ToInt32(adet.Text); i > 0 ; i--)
        {
            cmdb.ExecuteNonQuery();
        }
        cmda.ExecuteNonQuery();
        ClientScript.RegisterClientScriptBlock(this.GetType(), "K", "swal('İşlem Tamamlandı', 'Ürün adedi başarıyla güncellendi!', 'success')", true);
    }
    else
    {
        ClientScript.RegisterClientScriptBlock(this.GetType(), "K", "swal('Hata', 'Yeterli ürün bulunamadı!', 'error')", true);
    } 
}
else
{
    ClientScript.RegisterClientScriptBlock(this.GetType(), "K", "swal('Hata', 'Aradığınız ürün bulunamadı!', 'error')", true);
}

con.Close();
c# sql asp.net sql-server visual-studio
1个回答
0
投票

所有这些代码都可以用单个 SqlCommand 替换:

var sql=@"UPDATE urunler  
SET cikarTarih=@text, adet=adet-1 
WHERE barkod=@barcode AND adet>1";

using(var con = new SqlConnection(constr))
using (var cmd=new SqlCommand(con,sql))
{
    cmd.Parameters.Add("@barcode",SqlDbType.NVarchar,20).Value=barkod.Text ;
    cmd.Parameters.Add("@text",SqlDbType.NVarchar,20).Value=cikarTarih.Text ;

    var modified=cmd.ExecuteNonQuery();
    if(modified=0)
    {
        //Update failed, notify user.
    }
}

问题的代码不能保证不会出现负值,因为其他一些连接可以轻松读取相同的初始值并减少它。为了防止这种情况,需要显式事务。一次更新不需要额外的事务。

ExecuteNonQuery 返回受影响的行数

© www.soinside.com 2019 - 2024. All rights reserved.