The error message in my opinion is bogus.  If you check the Dispose call in reflector, it does in fact call Close as well as implement other functions.  It does not ONLY call close.  If this were actually disposing the object twice a run time error would result.  This does not happen. 

 

Close does not reset the object properties, nor does it return the database connection to the connection pool.  You can reopen the connection later if required, which will give you an error if you try to do this after calling dispose (the error will say that the connection string has not been set since Dispose resets the object properties).  These are definitely NOT equivalent methods. 

 

Although calling close explicitely is not necessary when using sqlconnection, I tend to implement my data access code the same way every time, and quite frankly I do not want to worry about whether the person who created the connection object thought to close the server connection in their dispose method.  I'd much rather call Close explicitly to insure that the server connection was in fact closed.  I've never seen a single instance where calling close before disposing causes an issue, but have run into issues with libraries that do not close the connection in their dispose.