2017-12-24 6 views
1

Ich habe eine SQL Server-Tabelle mit dem Namen store mit 3 Spalten IDS, Item_Name, Qunt. Ich habe vb mit Option, die von speichern einen Wert von Update-Anweisung nehmen.updateQuery dann überprüfen, ob der Wert kleiner als 0 wird

Mein Code ist:

Dim ADP = New SqlClient.SqlDataAdapter("update Store set Qunt = Qunt - @N_Qunt1 where [email protected]", 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 [email protected]", 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 [email protected]", 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 

Es funktioniert gut, aber auf jeden Fall, dass keine professionelle Sachen, die Idee von meinem Code, der die Update-Anweisung dann erinnern an die Tabelle ausführen und überprüfen, ob der Qunt Wert kleiner geworden ist als 0, um die Nachricht zeigen verweigern den Wert des Pull und dann wieder den Wert der Tabelle hinzufügen, irgendeine Idee, dies auf andere Weise zu tun? Dank

+2

Normalerweise ist dies am besten in einer gespeicherten Prozedur behandelt – Steve

+0

Einige Verbesserungen möglich dort denke ich; Sie laden Daten in ein Dataset herunter, und anstatt das Dataset zu betrachten, fangen Sie an, Daten aus dem Datenreader zu ziehen ?! auch, ich bin mir nicht sicher, ob ich die Logik verstanden habe, etwas zu inkrementieren, dann zu prüfen, ob es kleiner als 0 ist, und wenn es ist, es wieder inkrementieren? warum nicht einfach genug um es zu erhöhen, um es hinter 0 zu bekommen? (Wenn du -5 hast und 3 addierst, dann überprüfe, dann addiere noch 3 ... du hättest gerade 6 beim ersten Mal hinzufügen sollen!) –

+0

danke für Ihre schnelle Antwort, ich weiß nicht, aber vielleicht gibt es Weg zu temporären oder etwas, die die update-Anweisung ausführen und wenn Bedingung und überprüfen Wert und wenn wahr den Code vervollständigen und wenn falsch die Prozesse stoppen und nichts zu ursprünglichen Tabelle – TOFAYAS

Antwort

1

Sie können eine gespeicherte Prozedur zu Ihrer Datenbank wie dieser Diese gespeicherte Prozedur wird eine

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 

hinzufügen zuerst die verfügbare Menge führt dann das Update nur dann, wenn die verbleibende Menge größer oder gleich Null ist. Wenn dies nicht der Fall ist, führt die gespeicherte Prozedur das Update nicht aus. Um festzustellen, ob die gespeicherte Prozedur die Aktualisierung durchgeführt hat, können Sie den Rückgabewert von ExecuteNonQuery überprüfen.

Natürlich müssen Sie dafür kein SqlDataAdapter verwenden. Nur ein SqlCommand - viel einfacher und kürzer zu schreiben.

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 

Beachten Sie auch, dass ich die AddWithValue zu einem sicheren Add geändert haben. AddWithValue ist gut, viele Probleme haben bekannt und Nachteile

Can we stop using AddWithValue already?

+1

du bist retter , ich habe nur grundlegende Sache über SQL fand ich fehlende (,) in Stored Procedure @ Menge Integer @ IDs Integer 'sonst Arbeit groß der Code in Vb geändert zu' If (rowsUpdated <= 0) 'und arbeiten wie Magie danke – TOFAYAS

0

Es gibt eine viel einfachere Art und Weise Lager zu aktualisieren, aber über 0 bleiben sicher sein:

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

Diese Abfrage 0 Zeilen für nur beeinflussen 2 Gründe: Es gibt nicht genug Quint im Laden, oder die IDs ist völlig falsch. Ids nicht falsch sein kann, weil sie von einer Combo kam, die vermutlich mit gültigen Ids Werten gefüllt wurde, was bedeutet, wenn diese Abfrage aktualisiert 0 Zeilen dann nicht genügend qunt

war Wenn die Abfrage 1 Zeile auswirkt, wurde der angeforderte qunt abgezogen

Diese Abfrage ersetzt Ihr erstes Update; Sie können dann den Rest des Codes bin und nur den Rückgabewert von ExecuteNonQuery überprüfen, wie Steve tut.

+0

danke mein Herr, ich habe versucht, Ihre Methode in SQL und funktionierte gut, aber in Vb, wenn ich 'If checker.HasRows Then' es immer 0 zurückgeben selbst der Wert hat Zeile in SQL – TOFAYAS

+0

'Dim ADP = Neuer SqlClient.SqlDataAdapter (UPDATE speichern SET qunt = qunt - @ n_qunt1 WHERE ids = @ cb1 AND qunt> = @ n_qunt1, verbindung) ADP.SelectCommand.Parameters.Add (" @ N_Qunt1 ", SqlDbType.Float) .Wert = Convert.ToSingle (N_Qunt1.Text) ADP.SelectCommand.Parameters.Add (" @ cb1 ", SqlDbType.Int) .Wert = Convert.ToInt32 (ComboBox2.SelectedValue) checker = ADP.SelectCommand.ExecuteReader (CommandBehavior.CloseConnection) Wenn checker.HasRows Dann MsgBox ("0") Else MsgBox ("1") End If' – TOFAYAS

+0

immer wieder zurückkehren ** "1" ** – TOFAYAS

Verwandte Themen