计算以避免数据库中的负值

时间:2018-03-20 14:31:09

标签: c# sql-server

如何在我的程序中设置一个陷阱,当我按下购买按钮并且要购买的数量超过我的数据库中剩余的数量时,它将给出一个错误,即没有剩余的数量。目前它只是负值。 Sql server不支持无符号值,我不知道我想做什么是可能的。

这是我的代码。

SqlConnection con = new SqlConnection(
 @"Data Source=DESKTOP-39SPLT0\SQLEXPRESS;Initial Catalog=posDB;Integrated Security=True");

string Query = "UPDATE tblProducts SET qty = qty - @quantity where pName = @name";         
using (SqlCommand cmd = new SqlCommand(Query, con))
{
    cmd.Parameters.AddWithValue("@quantity", int.Parse(txBurger.Text));
    cmd.Parameters.AddWithValue("@name", label1.Text);              
    con.Open();
    cmd.ExecuteNonQuery();
    con.Close();
}
using (SqlCommand cmd = new SqlCommand(Query, con))
{                
    cmd.Parameters.AddWithValue("@quantity", int.Parse(txCheese.Text));
    cmd.Parameters.AddWithValue("@name", label5.Text);
    con.Open();
    cmd.ExecuteNonQuery();
    con.Close();
}

3 个答案:

答案 0 :(得分:7)

您可以在表格上设置CONSTRAINT的值qty。例如:

CREATE TABLE test (qty int);
ALTER TABLE test ADD CONSTRAINT PosQty CHECK (qty >= 0);
GO

INSERT INTO test VALUES(3);
GO
UPDATE test
SET qty = qty - 2; --Will work (3 - 2 = 1) 
GO
UPDATE test
SET qty = qty - 3; --Will fail (1 - 3 = -2)
GO
UPDATE test
SET qty = qty - 1; --Will work (1 - 1 = 0)
GO
--Clean up
DROP TABLE test;

当然,根据您的情况,这可能不合适。你肯定需要确保你的错误处理得当。

答案 1 :(得分:2)

我将如何做到这一点:

首先,更改您的查询:

UPDATE tblProducts 
SET qty = qty - @quantity 
where pName = @name
AND qty >= @quantity;
SELECT @@ROWCOUNT;

然后,不是使用ExecuteNonQuery使用ExecuteScalar并检查修改的记录数是0,而是表示@quantity大于{{1}的值1}}。

另外,我建议添加一个检查约束,如Larnu的answer.

所示

答案 2 :(得分:0)

也许您可以使用存储的proc调用并将整段代码包装到事务中。以下不是完整的代码,但您应该可以从这里获取它。

declare @newQty int
begin tran updateQty

UPDATE tblProducts SET qty = qty - @quantity where pName = @name
select @newQty qty = qty from tblProducts where pName = @name
if (@newQty < 0)
Begin
    rollback tran updateQty
    THROW 51000, 'The quantity is too low', 1;  
END
else 
BEGIN
    commit tran updateQty
END