2009-11-24 2 views
0

내 VB.NET 코드에서 SQLSERVER 2008에서 테이블의 레코드를 제거하는 저장 프로 시저를 호출하기 위해 ODBC.COMMAND를 생성하고 FOR NEXT 루프에서이 코드를 사용하며 1에서 20 개의 records_ID가 저장 될 수 있습니다 레코드 삭제 절차.저장 프로 시저를 두 번만 실행할 수있는 이유는 무엇입니까?

이 코드는 몇 개월 동안 잘 작동하지만 마지막 컴파일 이후 처음 두 레코드 만 삭제합니다.

VS 2008 IDE의 디버그 모드에서 정상적으로 작동합니다. 당신의 DELETE가보기에 의존하는 경우

VB.NET 코드

''' <summary> 
    ''' DELETE CANCELED CUSTOMER ORDERS 
    ''' </summary> 
    ''' <param name="sender"></param> 
    ''' <param name="e"></param> 
    ''' <remarks></remarks> 
    Private Sub tsbDiarioVenta_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsbDiarioVenta.Click 

     On Error GoTo Proc_Err 

     Using frmrslt As New BuscarForm() 

      frmrslt.Titulo = "Elimina Diarios de Venta en Contabilidad" 
      frmrslt.TextFieldID = "Cg_MovCab_ID" 

      frmrslt.Sql = " SELECT TIPO_COMP, NUM_COMP, FEC_DOC, COD_AUX, COD_REF, NUM_REF, STATUS, Cg_MovCab_ID " & _ 
         " FROM Cg_MovCab " & _ 
         " WHERE COD_EMPR = " & DataShared.gintCODEMPR & _ 
         " AND YEAR(FEC_DOC) = " & Me.txtPER_ANUAL.Text & _ 
         " AND MONTH(FEC_DOC) = " & Me.txtPER_MENSUAL.Text & _ 
         " AND COD_REF IN ('FAC', 'NV') " & _ 
         " ORDER BY 1,2 " 

      frmrslt.ShowDialog() 

      If frmrslt.Selected Then 

       Debug.Print(frmrslt.CountRows.ToString) 

       If frmrslt.CountRows > 0 Then 

        Cursor.Current = Cursors.WaitCursor 

        frmrslt.StartRow() 
        Dim idx As Integer 
        For idx = 0 To frmrslt.CountRows 

         Debug.Print(frmrslt.KeyValueID) 
         ClsCgMovs.DeleteID(frmrslt.KeyValueID) 
         frmrslt.NextRow() 


        Next 

        MsgBox(frmrslt.CountRows.ToString & " Regs. Eliminados", MsgBoxStyle.Information, "Mensaje del Sistema") 

       End If 

      End If 

     End Using 

     Cursor.Current = Cursors.Default 
     Exit Sub 

Proc_Err: 
     Cursor.Current = Cursors.Default 
     ErrHnd(Err.Number, Err.Description, ONDEBUG, "Frm_VtActLote: tsbDiarioVenta_Click: ", Erl) 
    End Sub 



    Public Function DeleteID(ByVal PRowID As Integer) As Boolean 

     On Error GoTo Proc_Err 

     Using odbcconn As New OdbcConnection(DataShared.gstrCNN) 

      odbcconn.Open() 
      Dim OdbcCmd As New OdbcCommand(_ 
       "{ ?=CALL proc_Cg_MovCab_DeleteID(" & PRowID & ") }", odbcconn) 

      OdbcCmd.Parameters.Add("@return", OdbcType.Int) 
      OdbcCmd.Parameters("@return").Direction = ParameterDirection.ReturnValue 

      OdbcCmd.ExecuteNonQuery() 
      If CInt(OdbcCmd.Parameters("@return").Value) = 0 Then 
       DeleteID = True 
      Else 
       DeleteID = False 
      End If 

     End Using 

     Exit Function 

Proc_Err: 
     ErrHnd(Err.Number, Err.Description, ONDEBUG, "ClsCgMovs: DeleteID: ") 
     DeleteID = False 
    End Function 




ALTER PROCEDURE [dbo].[proc_Cg_MovCab_DeleteID] 
(
    @ID int 
) 

AS 
    SET NOCOUNT ON 

    DECLARE @errornum int 

    BEGIN TRAN 

    DELETE FROM Cg_MovCab 
    WHERE Cg_MovCab_ID = @ID 

    SET @errornum = @@ERROR 
    IF @errornum <> 0 GOTO PROC_ERR 

    COMMIT TRAN 

    RETURN @errornum 

PROC_ERR: 
    ROLLBACK TRAN 
    RETURN @errornum 
+0

저장 프로 시저 코드, 실행되는 데이터 모델 및 저장 프로 시저를 호출하는 코드가 필요합니다. –

+0

도움을 받으려면 코드를 참조하십시오. –

+0

당신은 정말로 귀하의 SP와 귀하의 호출 VB 코드를 붙여 넣는 것을 고려해야합니다 ... –

답변

0

당신은 삭제하고 관련 VIEW를 다시 시도 할 수 있습니다. 기본 테이블이 변경되면 VIEWS가 잘못된 값 (즉, 열 전환 등)을 반환합니다.

는 그냥 총을 takein ...

편집 :

ATPS :

AFAIR 광산의 생산 시스템에서이 문제 의 원인이 된 테이블 구조 (필드를 추가/제거)를 changeing. SQL 2005 btw.

1

사용 가능한 연결이 부족할 수 있으므로 Exit Function 전에 odbcconn.Close()를 호출 해보십시오. 이렇게하면 이전에 작동 한 이유, 허용 된 연결 수가 수정되거나 업데이트를 통해 다시 설정되거나 누군가가 손쉽게 작동하는 경우 설명 할 수 있습니다.

+0

with 자동으로 최종 사용시 연결 자원 사용을 닫습니다. 이 코드는 las 재 컴파일 때까지 제대로 작동하지만 모든 행이 변경되었습니다! – RicardoBalda

관련 문제