开发者

Why I can only execute a stored procedures two times?

In my VB.NET code I construct a ODBC.COMMAND to call a stored procedure that eliminates a record from table in SQLSERVER 2008, I use this code in a FOR NEXT loop, it may contain 1 to 20 records_ID to pass to stored procedures to delete the records.

This code work well for several months, but since the last compilation it only deletes the first 2 records.

In debug mode in VS 2008 IDE works fine.

VB.NET CODE

    ''' <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(frmrsl开发者_StackOverflow中文版t.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


It could be that you're running out of available connections, try calling odbcconn.Close() before you Exit Function. This could explain why it worked before, if the allowed number of connections were modified or reset via an update, or someone tinkering.


If your DELETE depends on a VIEW you could try to drop and recreate the relevant VIEW. If the underlying tables change, VIEWS happen to return wrong values (i.e. switching columns and such).

Just takein a shot...

EDIT:

atPS:

AFAIR changeing the table structure (adding / removing fields) caused this issue on production system of mine. SQL 2005 btw.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜