I'm pretty sure your right. When I was researching and article on IDisposable some years ago, I jumped into the framework using reflector, and unlike many other IDisposable objects that had an alternate method like Close() or Free() that just called Dispose() or vice versa, the SqlDbConnection object does different things, one of which was collection pooling.
Unfortuneatly, because the "using" construct is so easy to use, a lot of code examples these days have the DB connection created within a "using" expression, typically as the out most in a set of nested usings.
You could achieve the same thing with a "try" and protected "finally" where you check that the connection is not null and is open before calling close on it. This is the way VB programmers had to do it before they got the "using" keyword.
Another way, though I'm bound to draw some criticism for suggesting it, is to wrap the connection within another thin IDisposable object that takes and exposes an IDbConnection object and calls Close() on the connection within the wrappers Dispose(). It doesn't follow the IDisposable pattern correctly, but if you know why your doing it, understand the impacts, and not hiding it from anyone (either not exporting your code or declare the behaviour) then I can't really see a problem. The last time I used this trick I made it a generic type so that I could tap the concrete DB Connection type without the need to cast it for those functoins that don't accept IDbConnection.