2009-11-24 220 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