我在vb.net中有这个代码:
reader = myCommand.ExecuteReader
If reader.HasRows Then
While reader.read
End While
End If
我应该在End While
之后或End If
答案 0 :(得分:2)
最好的方法是使用Using
-statement来确保处理非托管资源(即使出错)。这也使读者关闭。
Using reader = myCommand.ExecuteReader()
If reader.HasRows Then
While reader.read
End While
End If
End Using
Is it necessary to manually close and dispose of SqlDataReader?
答案 1 :(得分:0)
将.Close
放在哪里没有区别。更重要的是要确保你处理命令对象(你应该处理实现IDisposable
的任何对象。你发布的代码不清楚你是否这样做。
最简单的方法是将其包装在使用块中
如果你看example on MSDN。这是他们使用的模式:
Using connection As New SqlConnection(connectionString)
Dim command As New SqlCommand(queryString, connection)
connection.Open()
Dim reader As SqlDataReader = command.ExecuteReader()
' Call Read before accessing data.
While reader.Read()
End While
' Call Close when done reading.
reader.Close()
End Using
但由于SqlDataReader
也实现了IDisposable
- 所以最好还是将读者包装在using
块中。
在using
屏蔽结束时,reader
已关闭并为您处理,这意味着您无需担心:
Using connection As New SqlConnection(connectionString)
Dim command As New SqlCommand(queryString, connection)
connection.Open()
Using reader As SqlDataReader = command.ExecuteReader()
While reader.Read()
End While
End Using
End Using
请注意,您无需检查是否reader.HasRows
,因为如果没有行,reader.Read
将返回False。有关详细信息,请参阅此答案:Should if call SqlDataReader.HasRows if I am calling SqlReader.Read
答案 2 :(得分:0)
另一种方法是
Try
reader = myCommand.ExecuteReader
If reader.HasRows Then
While reader.read
End While
End If
Catch ex as Exception
Finally
reader.Close()
End Try