A connection by default can only have one open DataReader at a time. When you're done with any DataReader you must call Close on it. If you share the connection throughout your program and you don't do this you'll run into this issue.
You can implement MultipleActiveResultSets through the connection string BUT this should only be done when you intended to do it, not to fix hanging readers that aren't in use anymore.
https://msdn.microsoft.com/en-us/library/h32h3abf(v=vs.110).aspx
A better way to be to use a pattern like this that will cleanup everything for you:
' Using Statements will handle closing and disposing
Using conn As New SqlConnection("server=YourServer;database=YourDatabase;trusted_connection=yes;")
conn.Open()
Using cmd As SqlCommand = conn.CreateCommand
cmd.CommandText = "select * from yourtable"
' The reader doesn't implement IDisposeable BUT this will close the reader
' even in the case of exception
Using dr As SqlDataReader = cmd.ExecuteReader
While dr.Read
' Do what you need to do with your DataReader
Dim buf As String = dr("myField")
End While
End Using
End Using
' The using should call close I always close via Dispose out of habit
conn.Close()
End Using