返回值已分配,但始终返回为0

时间:2019-06-26 15:44:28

标签: vb.net

我正在尝试使用以下代码来计算客户的订单总数和订单价值。

    Dim iOrderCount As Integer
    Dim iLineCount As Integer
    Dim cTotalGoods As Decimal
    Dim cTotalVat As Decimal
    Dim cTotalDelivery As Decimal

    Using manOrders As New CManOrders(m_dbSql)
manOrders.GetOrdersInProgress(sAccountCode, iOrderCount, iLineCount, cTotalGoods, cTotalVat, cTotalDelivery)

当我在GetOrdersInProgress子例程中为这些变量分配值时,这些值已正确分配,当我逐步执行代码时可以看到这些值。

Public Sub GetOrdersInProgress(sAccountCode As String, ByRef RET_orderCount As Integer, ByRef RET_lineCount As Integer,
                               ByRef RET_totalGoods As Decimal, ByRef RET_totalVat As Decimal, RET_totalDelivery As Decimal)

    ...

    For Each dr As DataRow In m_dbSql.getDataTable(sql).Rows
        RET_orderCount = dbToInt(dr(ORDER_COUNT))
        RET_lineCount = dbToInt(dr(LINE_COUNT))
        RET_totalGoods = dbToDecimal(dr(TOTAL_GOODS))
        RET_totalVat = dbToDecimal(dr(TOTAL_VAT))
        RET_totalDelivery = dbToDecimal(dr(2))

        Return
    Next

但是,一旦我逐步执行并返回到调用GetOrdersInProgress子例程的位置,变量中的所有值都将正确返回,除了RET_totalDelivery-我拥有的新变量已添加到另一个开发人员的项目中。 RET_totalDelivery行中Public Sub GetOrdersInProgress...变量中的值是正确的,并且在赋值后是正确的,但是当达到Return时,出于某种原因,这些变量将在父子例程中使用除了我添加的新内容RET_totalDelivery以外,其他所有内容都是正确的。我想知道该值是否分配不正确,但是分配正确。

为什么总是一直返回0?

2 个答案:

答案 0 :(得分:4)

默认情况下,传递给vb.net方法的参数是按值或ByVal传递的。您没有在ByRef

RET_totalDelivery自变量中指定GetOrdersInProgress.

在方法结束时不会保留对通过值传递的参数所做的更改。

您的订阅者现在应该是...

Public Sub GetOrdersInProgress(sAccountCode As String, ByRef RET_orderCount As Integer, ByRef RET_lineCount As Integer, ByRef RET_totalGoods As Decimal, ByRef RET_totalVat As Decimal, ByRef RET_totalDelivery As Decimal)

答案 1 :(得分:1)

我更喜欢将方法编写为函数。编写一个类来保存所有返回值。然后将方法更改为仅带有输入参数的函数,并返回您从sql获取的值。

Sub Main
    Dim bl = New OrdersInProgressBusinessLogic()
    Dim ordersInProgress = bl.GetOrdersInProgress("some account code")
End Sub

Public Class OrdersInProgress
    Public Property OrderCount As Integer
    Public Property LineCount As Integer
    Public Property TotalGoods As Decimal
    Public Property TotalVat As Decimal
    Public Property TotalDelivery As Decimal
End Class

Public Class OrdersInProgressBusinessLogic

    Public Function GetOrdersInProgress(sAccountCode As String) As OrdersInProgress
        Dim ordersInProgress = New OrdersInProgress()

        ' some code here to fetch data from sql

        For Each dr As DataRow In m_dbSql.getDataTable(sql).Rows
            With ordersInProgress
                .OrderCount = dbToInt(dr(ORDER_COUNT))
                .LineCount = dbToInt(dr(LINE_COUNT))
                .TotalGoods = dbToDecimal(dr(TOTAL_GOODS))
                .TotalVat = dbToDecimal(dr(TOTAL_VAT))
                .TotalDelivery = dbToDecimal(dr(2))
            End With
        Next

        Return ordersInProgress
    End Function

    ' some other functions/subs for OrdersInProgress class

End Class