变量 'GetTransNo' 在赋值之前被使用。空引用异常可能会在运行时产生”

Variable 'GetTransNo' is used before it has been assigned a value. A null reference exception could result at runtime"

我有一个名为 GetTransNo() 的函数,但是当我 运行 代码时,我得到了这个错误 变量 'GetTransNo' 在赋值之前被使用。空引用异常可能会在 运行 时产生” 请任何人帮助我这个

 Function GetTransNo() As String
        Try
            Dim sdate As String = Now.ToString("yyyyMMdd")
            cn.Open()
            cm = New SqlCommand("Select * From TblCart Where TransNo Like '" & sdate & "%' Order By Id Desc", cn)
            dr = cm.ExecuteReader
            dr.Read()
            If dr.HasRows Then

                GetTransNo = CLng(dr.Item("Transno").ToString) + 1
            Else
                GetTransNo = sdate & "0001"


            End If
            dr.Close()
            cn.Close()

        Catch ex As Exception
            cn.Close()
            MsgBox(ex.Message, vbCritical)
        End Try

        Return GetTransNo
    End Function

这里是我调用函数的地方

Private Sub BtnNewOrder_Click(sender As Object, e As EventArgs) Handles BtnNewOrder.Click
        If CheckTransaction() = True Then


            LblTransNo.Text = GetTransNo()
            With FrmSelectTable
                .LoadTable()

                .ShowDialog()
            End With
            loadcart()
        Else
            MsgBox("Transaction is already closed", vbExclamation)
        End If
    End Sub

在过去,通过编写 functionName = theReturnValue 从函数返回一个值,如问题中的代码所示 GetTransNo = sdate & "0001"

返回值的现代方法是使用 Return 语句,如下代码所示:

Function GetTransNo() As String
    Dim sql = "SELECT TOP (1) TransNo FROM TblCart
               WHERE TransNo LIKE @TransNo
               ORDER BY Id DESC"

    Dim sdate As String = Now.ToString("yyyyMMdd")
    Dim transNo As String = ""

    Using conn As New SqlConnection("yourConnectionStingGoesHere"),
            sqlCmd As New SqlCommand(sql, conn)

        sqlCmd.Parameters.Add(New SqlParameter With {.ParameterName = "@TransNo",
                                                     .SqlDbType = SqlDbType.VarChar,
                                                     .Value = sdate & "%"})

        Try
            conn.Open()
            Dim rslt = sqlCmd.ExecuteScalar()

            If rslt Is Nothing Then
                transNo = sdate & "0001"
            Else
                transNo = (CLng(rslt) + 1).ToString()
            End If

        Catch ex As Exception
            MsgBox(ex.Message, vbCritical)

        End Try

    End Using

    Return transNo

End Function

编译器被 Return 与函数名称混淆了。

此外,我使用参数传递值 - 您应该始终使用参数,因为这是一个好习惯,可以防止很多潜在问题。

您不得多次尝试重新使用数据库连接(问题代码中的cn),因为那样也会导致混淆。使数据库每次都高效地创建一个新连接。

这是因为你的函数有一种方法“GetTransNo”没有得到任何值:当它立即离开 try catch 时。 有 2 个解决方案:

为 GetTransNo 定义一个默认值:

 Function GetTransNo() As String
    GetTransNo = ""
    Try
       [...]
    End Try

    Return GetTransNo
End Function

在catch中定义一个值,当数据库读取失败时:

Function GetTransNo() As String
 
    Try
        [...]

    Catch ex As Exception
        cn.Close()
        MsgBox(ex.Message, vbCritical)
        GetTransNo = ""
    End Try

    Return GetTransNo
End Function

并且当您调用该函数时,您可以检查它是否返回 ""(= 发生错误),但在您的情况下,它不是很有用。