2009-11-24 326 views
0

在我的VB.NET代碼中,我構造了一個ODBC.COMMAND來調用SQLSERVER 2008中從表中刪除記錄的存儲過程,我在FOR NEXT循環中使用此代碼,它可能包含1到20個records_ID以傳遞給存儲程序刪除記錄。爲什麼我只能執行一次存儲過程兩次?

此代碼可以正常工作數月,但自上次編譯以來,它只會刪除前2條記錄。

在VS 2008中的調試模式下IDE工作正常。

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

我們將需要存儲過程代碼,它執行的數據模型以及調用存儲過程的代碼。 – 2009-11-24 17:34:03

+0

我們需要查看您的代碼以獲取幫助。 – 2009-11-24 17:34:30

+0

你真的應該考慮粘貼你的SP和你的調用VB代碼... – 2009-11-24 17:34:51

回答

0

如果您DELETE取決於VIEW你可以嘗試刪除並重新創建相關視圖。 如果底層表發生變化,VIEWS碰巧返回錯誤的值(即切換列等)。

只是takein了一槍......

編輯:

ATPS:

AFAIR量變到質變的表結構(添加/刪除字段)導致此問題 對礦井的生產系統。 SQL 2005 btw。

1

可能是因爲您的可用連接用完了,請在退出函數之前嘗試調用odbcconn.Close()。這可以解釋爲什麼它在以前工作,如果通過更新修改或重置允許的連接數量,或者有人修改。

+0

在自動結束使用時關閉連接的資源。 此代碼正常工作,直到las重新編譯,但任何行被更改! – RicardoBalda 2009-11-25 16:46:39