2017-12-24 2 views
1

store이라는 SQL Server 테이블이 3 열 IDS, Item_Name, Qunt 인 테이블이 있습니다. 업데이트 문에 의해 값을 저장하는 옵션이있는 VB가 있습니다.updateQuery 그런 다음 값이 0보다 작아 지는지 확인하십시오.

내 코드는 다음과 같습니다

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 

그것은 잘 작동하지만, 확실히이없는 전문 물건, 업데이트 문은 다음 테이블을 기억하고 Qunt 값이 덜 0보다 될 경우 검사 실행 내 코드의 아이디어 끌어 오기 값을 거부하는 메시지가 나타나면 테이블에 값을 추가하십시오. 다른 방법으로이 작업을 수행 할 생각이 있습니까? 감사

+2

일반적으로 저장 프로 시저 내에서 가장 잘 처리됩니다. – Steve

+0

몇 가지 개선점이 있다고 생각합니다. 당신은 데이터 세트로 데이터를 다운로드 한 다음 데이터 세트를 보지 않고 데이터 아랫쪽에서 데이터를 꺼내기 시작합니다. 또한, 내가 뭔가를 증분의 논리를 이해하고 있는지 확인하지 못하고, 0보다 작 으면 다시 검사하고, 그렇지 않으면 다시 증가 시키는가? 왜 0을 지나치게 늘리면 충분하지 않습니까? (-5이 있고 3을 더한 다음 확인하고 다시 3을 더하십시오. 처음에 6을 추가해야합니다!) –

+0

귀하의 빠른 회신 해 주셔서 감사합니다,하지만 어쩌면 거기 임시 또는 뭔가를 업데이 트 문을 실행하고 확인하고 값을 확인하고 진정한 경우 코드를 완료하고 프로세스를 중지하고 원래 테이블에 아무 것도하지 말아요 – TOFAYAS

답변

1

당신이 저장 프로 시저가 먼저 사용할 수있는 양을 가져옵니다 잔량이 크거나 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 - 쓰기가 훨씬 간단하고 짧습니다. 내가 Add 더 안전에 AddWithValue을 변경 한 것이

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 잘 많은 문제가있는 것으로 알려진 및 재고를 업데이트 할 수 있지만 0 이상으로 유지해야하는 더 간단한 방법이있다

Can we stop using AddWithValue already?

+1

당신은 구원자입니다. , 난 단지 SQL에 대한 기본적인 것들을 잃어버린 (,) '@ 수량 정수 @@ 정수 정수 @ ids 정수'에서 누락 찾을 수 VB에서 코드가 변경되면 VB에서 코드가 변경되었습니다 (행 Updated <= 0) 및 마법 감사합니다 – TOFAYAS

0

단점이있다 :

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

이 쿼리는 0 행에 영향을 미칠 것이 2 가지 이유 : 저장소에 충분한 qunt가 없거나 ID가 완전히 잘못되었습니다. 그것은이 쿼리는 쿼리가 1 행에 영향을 미치는 경우 0 행이 다음 불충분 qunt

있었다 업데이트하면 의미 아마도 유효한 식별자의 값으로 생성 된 콤보에서 왔기 때문에 ID가 잘못 될 수 없습니다, 요청 qunt는

을 공제 한

이 쿼리는 첫 번째 업데이트를 대체합니다. 그런 다음 나머지 코드를 bin하고 Steve처럼 ExecuteNonQuery의 반환 값을 확인할 수 있습니다.

+0

선생님, SQL에서 당신의 방법을 시도하고 괜찮 았지만 VB에서 내가'checker.HasRows Then'을했을 때 항상 0을 반환합니다. 값도 SQL – TOFAYAS

+0

에 행이 있습니다. Dim ADP = New SqlClient.SqlDataAdapter (UPDATE store SET qunt = qunt - @ n_qunt1 WHERE ids = @ cb1 AND qunt> = @ n_qunt1, 연결) ADP.SelectCommand.Parameters.Add (" @ N_Qunt1 ", SqlDbType.Float) .Value = Convert.ToSingle (N_Qunt1.Text) ADP.SelectCommand.Parameters.Add ("@ cb1 ", SqlDbType.Int) .Value = Convert.ToInt32 (ComboBox2.SelectedValue) 검사기 = ADP.SelectCommand.ExecuteReader (위해 CommandBehavior.CloseConnection) checker.HasRows 그런 다음 있는 MsgBox ("0") 그렇지 있는 MsgBox는 ("1") 끝 If' – TOFAYAS

+0

항상 돌아 가면 ** "1"** – TOFAYAS

관련 문제