【发布时间】:2018-02-03 04:58:12
【问题描述】:
尝试修复警告,但不确定如何将代码重组为 reader.IsClosed 会引发警告,指出“变量‘reader’在被赋值之前已被使用。运行时可能会导致空引用异常。 "从逻辑上讲,由于 reader As SqlDataReader && reader 没有使用值初始化,所以我可以忽略 as 在运行时应该没问题,但我的经验不足会让我相信有更好的方法吗?
Public Function GetTotalItems(ByVal userId As Long) As Int16
Dim lstParam As List(Of SqlParameter) = New List(Of SqlParameter)()
Dim tablMd = Me.GetMetaData()
Dim retList As ArrayList = New ArrayList()
lstParam.Add(New SqlClient.SqlParameter("@" + tablMd.PrimaryKey.ColumnName, 0))
lstParam.Add(New SqlClient.SqlParameter("@UserID", userId))
lstParam.Add(New SqlClient.SqlParameter("@ActionFlag", "SELECT_ITEMS_COUNT"))
Dim spName As String = Me.GetStoreProcname()
Dim reader As SqlDataReader
Try
reader = SqlHelper.ExecuteReader(
Utility.GetConnectionStringSetting(),
CommandType.StoredProcedure,
Me.GetStoreProcname(),
lstParam.ToArray()
)
If (reader.HasRows = True) Then
If (reader.Read()) Then
Dim value As Object = reader(0)
Return CInt(value)
End If
End If
Catch ex As Exception
Throw
Finally
If Not reader.IsClosed Then
reader.Close()
End If
End Try
Return 0
End Function
【问题讨论】:
-
提示:
Dim reader As SqlDataReader需要修改,为你DIY。另外你最好开始使用using -
更具体地说,当您在
Finally块中获取其IsClosed属性时,您假设reader具有值,但如果您的SqlHelper.ExecuteReader方法抛出异常,则 @987654329 @ 在那时将没有值。 -
另外,您的
Catch块完全没有意义。如果您有Finally块,则不需要Catch块,因此如果您不打算在其中做任何事情,请不要添加一个块。尽管如此,您应该使用Using块。如果你这样做,那么你可以取消整个Try...Catch...Finally,因为它会实现同样的事情,而没有NullReferenceException的可能性。 -
添加到@jmcilhinney 简要解释的内容,保留Options Strict & Explicit ON。
-
如果您在
Using块中创建阅读器,则无需在 finally 块中关闭它,而且您将消除警告。
标签: vb.net