从SQL存储过程引发异常时,TRY CATCH不起作用

时间:2018-01-25 20:00:23

标签: vb.net vb6-migration

因此,由于某种原因,我的TRY CATCH没有捕获SQL Server存储过程抛出的异常。 基本上,我执行一个过程,它完成它所需要的或引发错误。需要在VB应用程序中捕获并引发此错误。 我究竟做错了什么?是的,SQL确实会抛出错误......

    Public Function InsertDetails(ByVal dBillingDate As Date) As Boolean
    Dim result As Boolean = False
    Dim bReturn As Boolean = True
    Try
        CleanUp(ObjCmd)
        ObjCmd = UpgradeHelpers.DB.AdoFactoryManager.GetFactory().CreateCommand()

        ObjCmd.CommandText = "usp_InsAfterHours"
        ObjCmd.CommandType = CommandType.StoredProcedure
        ObjCmd.CommandTimeout = 0
        ObjCmd.Connection = SQLServerDB

        'Get the parameters from the sproc
        ParametersHelper.DeriveParameters(ObjCmd, UpgradeHelpers.DB.AdoFactoryManager.GetFactory())

        With ObjCmd.Parameters
            ObjCmd.Parameters(1).Value = dBillingDate
        End With

        ObjCmd.ExecuteNonQueryAsync()

        Do While ObjCmd.Connection.State = ConnectionState.Executing
            LoopSet = ""
        Loop

    Catch ex As Exception
        If (TypeOf ex Is OleDb.OleDbException) Then
            RaiseError(DirectCast(ex, OleDb.OleDbException).ErrorCode, Me.GetType().Name & ".InsertDetails", ex, DirectCast(ex, OleDb.OleDbException).Errors, g.sDatabaseUserName)
        Else
            RaiseError(CInt(ex.HResult), Me.GetType().Name & ".InsertDetails", ex, , g.sDatabaseUserName)
        End If

        bReturn = False

    Finally 
        CleanUp(ObjCmd)
        result = bReturn
    End Try

    Return result
End Function

1 个答案:

答案 0 :(得分:2)

我建议做一些改变:

您不是在等待功能完成:

 await ObjCmd.ExecuteNonQueryAsync()

然后删除正在进行检查的循环。

使用该命令抛出异常,而不是RaiseError。

Throw new ApplicationException(Me.GetType().Name & ".InsertDetails", ex)

然后,您的调用者代码可以使用ex.GetBaseException()来获取错误列表等信息,假设ex.GetBaseException()。Type是Ole Exception

理想情况下,您希望将System.Data.SqlClient而不是System.Data.OleDb用于连接到.NET Framework中的SQL Server的对象。