Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 返回值已赋值,但始终返回为0_Vb.net - Fatal编程技术网

Vb.net 返回值已赋值,但始终返回为0

Vb.net 返回值已赋值,但始终返回为0,vb.net,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.GetOrdersInPro

我试图使用下面的代码计算客户订单的总数和价值

    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(我添加到另一个开发人员的项目中的新值)之外。 公共子GetOrdersInProgress中RET_totalDelivery变量中的值。。。行是正确的,在赋值之后也是正确的,但是当它到达Return并且变量被用于父子例程时,出于某种原因,它们都是正确的,除了我添加的新变量RET_totalDelivery。如果没有正确分配值,我会理解的,但是它是


为什么它总是返回0?

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

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

你的潜艇现在应该是

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)

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

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

你的潜艇现在应该是

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)

我更喜欢把这个方法写成函数。编写一个类来保存所有返回值。然后将该方法更改为只包含输入参数的函数,并返回从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

我更喜欢把这个方法写成函数。编写一个类来保存所有返回值。然后将该方法更改为只包含输入参数的函数,并返回从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

注意:这仅适用于值类型,引用类型总是通过ref传递。请参阅@AConfusedSimpleton,这不是真的。引用类型也以ByVal作为默认值传递。只是ByRef和ByVal对于引用类型有不同的含义。当引用类型通过val传递时,您可以更改它的属性,但不能更改它引用的对象。有关更多信息和示例,请参见此。@Stevendogart,谢谢,我不知道。我记得在某个地方读到过引用类型总是通过ref传递的,因为我所做的似乎是正确的,所以我假设这是真的。注意:这只适用于值类型,引用类型总是通过ref传递。请参阅@AConfusedSimpleton,这不是真的。引用类型也以ByVal作为默认值传递。只是ByRef和ByVal对于引用类型有不同的含义。当引用类型通过val传递时,您可以更改它的属性,但不能更改它引用的对象。有关更多信息和示例,请参见此。@Stevendogart,谢谢,我不知道。我记得在某个地方读到,引用类型总是通过ref传递的,因为我所做的似乎是正确的,所以我假设这是真的。@TimSchmelter创建DataTable的SQL做的是求和,所以只有一行数据。不过,这是一个很好的观点。@TimSchmelter创建DataTable的SQL完成了数据的求和,因此只有一行数据。不过,这是一个很好的观点。