I have a class called DatabaseHelper that wraps a DbConnection. What's the proper way to setup this class for a using statement? I have implemented IDisposible, but I'm not sure when and where I should be calling Connection.Close() or Connection.Dispose().
When I simply call Connection.Dispose() in my own Dispose() method, I'll sometimes get a SocketException from my DbConnection object. I assume this is because old connections are being left open, but there's no details attached the to exception, so I can't know for sure.
Just to complete the IDisposable implementation pattern, it's convention to include a finalizer (destructor) for your class which calls the Dispose() method (passing false). This acts as a failsafe mechanism, allowing you to dispose of unmanaged objects if the consumer of the class fails to call Dispose().
This destructor syntax is actualy the finalizer. The finalizer is calling Dispose(false) method.
There is no need of the finalizer(or destructor) syntax until your code has part 2 code. Otherwise it should be implemented for the safe side. ie, even though the programmer is not calling the dispose method properly, finalize should clean up the unmanaged resources.
compare the examples: From msdn
http://msdn.microsoft.com/en-us/library/system.idisposable.dispose.aspx & http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx
Call connection.Dispose() from within your dispose method. You should look at the standard pattern for implementing IDisposable, which goes above and beyond simply implementing the IDisposable interface and allows for disposing unmanaged objects etc:
(Taken from http://msdn.microsoft.com/en-us/library/system.idisposable.aspx).
According to this newsgroup:
Here is how IDbConnection.Dispose() is implemented (as Reflector utility shows):
SqlClient:
Your dispose method should only attempt to close the connection if it is open.