If you want the reader to close the connection, you can use the ExecuteReader () overload:
...
using (IDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
...
By default, deleting the reader does not release the connection. - see MSDN for more information ...
To resolve the Close()vs issue Dispose(), MSDN states:
If the DbConnection goes out of scope, it is not closed. Therefore, you must explicitly close the connection by calling Close or Dispose, which are functionally equivalent.
, . , , . , Dispose(), null, , .