更新,然后检查值是否小于0



我有一个名为store的SQL Server表,带有3列IDS, Item_Name, Qunt。我的VB带有从商店中获得值的VB。

我的代码是:

Dim ADP = New SqlClient.SqlDataAdapter("update Store set Qunt = Qunt - @N_Qunt1 where IDS=@CB1", connection)
ADP.SelectCommand.Parameters.AddWithValue("@CB1", ComboBox2.SelectedValue)
ADP.SelectCommand.Parameters.AddWithValue("@N_Qunt1", N_Qunt1.Text)
If connection.State = ConnectionState.Closed Then
    connection.Open()
End If
ADP.SelectCommand.ExecuteNonQuery()
Collection.Close()
Dim ADP1 = New SqlClient.SqlDataAdapter("select * from store where IDS=@CB1", connection)
ADP1.SelectCommand.Parameters.AddWithValue("@CB1", ComboBox2.SelectedValue)
Dim Ds = New DataSet
ADP1.Fill(Ds)
Dim Dt = Ds.Tables(0)
Dim dr = Dt.Rows(0)
If dr!Qunt < 0 Then
    MsgBox(" الكمية المراد سحبها اكبر من المتواجده بالمخزن ", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "سحب")
    Dim ADP2 = New SqlClient.SqlDataAdapter("update Store set Qunt = Qunt + @N_Qunt1 where IDS=@CB1", connection)
    ADP2.SelectCommand.Parameters.AddWithValue("@CB1", ComboBox2.SelectedValue)
    ADP2.SelectCommand.Parameters.AddWithValue("@N_Qunt1", N_Qunt1.Text)
    If connection.State = ConnectionState.Closed Then
        connection.Open()
    End If
    ADP2.SelectCommand.ExecuteNonQuery()
    connection.Close()
    CLEAR_TEXTBOXES(Me)
    Exit Sub
Else
    MsgBox(" تمت سحب الكمية بنجاح ", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "سحب")
End If

它可以正常工作,但绝对不是专业的东西,我执行更新语句的代码的想法,然后召回表格,并检查Qunt值是否少于0,显示拒绝的消息,然后再添加对桌子的价值,以其他方式这样做的想法吗?谢谢

您可以像这样的数据库添加存储过程

CREATE PROCEDURE [UpdateIfQuantityOK]
    @quantity integer,
    @ids integer
AS
    declare @sum integer
    select @sum = Sum(QUNT) 
    from store 
    where ids = @ids
    if @sum - @quantity >= 0 
    begin
        update Store 
        set Qunt = Qunt - @quantity 
        where IDS = @ids
    end

此存储过程首先获取可用的数量,然后仅当剩余数量更大或等于零时才能执行更新。如果不是这种情况,则存储过程不会执行更新。为了发现存储过程是否已完成更新,您可以从ExecuteNonQuery检查返回值。

当然,您无需为此使用SqlDataAdapter。只是一个 SqlCommand-更简单,更短。

Dim cmd = new SqlCommand("UpdateIfQuantityOK", con)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@quantity", SqlDbType.Int).Value = Convert.ToInt32(N_Qunt1.Text)
cmd.Parameters.Add("@ids", SqlDbType.Int).Value = Convert.ToInt32(ComboBox2.SelectedValue)
Dim rowsUpdated = cmd.ExecuteNonQuery()
if rowsUpdated <= 0 Then
   MessageBox.Show("Not enough quantity available")
Else
   ....
End if

还请注意,我已将AddWithValue更改为更安全的AddAddWithValue众所周知有许多问题和缺点

我们可以停止使用addWithValue吗?

有一种更简单的更新库存的方法,但请确保保持高于0:

UPDATE store SET qunt = qunt - @n_qunt1 WHERE ids = @cb1 AND qunt >= @n_qunt

此查询仅出于2个原因而影响0行:商店中没有足够的清点,或者IDS完全错误。ID不会错,因为它来自可能填充有效IDS值的组合,这意味着如果此查询更新0行,则Qunt

不足

如果查询会影响1行,则扣除了请求的Qunt

此查询替换您的第一个更新;然后,您可以像Steve一样,将其余的代码汇总,然后检查ExecuteNonquery的返回值。

相关内容

最新更新