我有一个名为store
的SQL Server表,其中包含3列IDS, Item_Name, Qunt
。我有一个带有选项的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
它运行正常,但绝对不是专业的东西,执行update语句的代码的想法然后调用表并检查Qunt值是否小于0消息显示拒绝pull的值然后重新添加表的价值,任何想法通过其他方式做到这一点? 感谢
答案 0 :(得分:1)
您可以像这样添加存储过程到数据库
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
更改为更安全的Add
。众所周知AddWithValue
有许多问题和缺点
答案 1 :(得分:0)
有一种更简单的更新库存的方法,但一定要保持在0以上:
UPDATE store SET qunt = qunt - @n_qunt1 WHERE ids = @cb1 AND qunt >= @n_qunt
此查询将影响0行,原因只有两个:商店中没有足够的qunt,或者ids完全错误。 Ids不能错,因为它来自一个可能填充有效ids值的组合,这意味着如果此查询更新了0行,那么就没有足够的qunt
如果查询影响1行,则扣除所请求的qunt
此查询取代您的第一次更新;然后你可以将剩下的代码分开,然后像Steve一样检查ExecuteNonQuery的返回值。