变量 '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
并且当您调用该函数时,您可以检查它是否返回 ""(= 发生错误),但在您的情况下,它不是很有用。
我有一个名为 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
并且当您调用该函数时,您可以检查它是否返回 ""(= 发生错误),但在您的情况下,它不是很有用。