Yes, best practice is to have many catches, and not use the general exception, tools like fxcop will confirm this when analyzing your code. In practice i seen mostly 2-3 catches.
You could look in your object explorer to see from which class derives your exception and catch the parent exception instead of all 8 possible exception.
Practically, look at what can fail in the way you are currently using the object, very often only one or two exceptions are likely to happen, then you can follow it up with a general one.
Catching exceptions should not be used to control flow, it should be used to handle a situation where your method dosen't have what it needs to do it's work successfully.
Inside the catch you will generally write to either a log file or the system's event log. You'd write something like
string message = "Error when retrieving product from database. The system reports: ex.Message"
or
string message = "Error when retrieving product from database"
if(ex.Number == 20)
{
message = message + " This likely indicates that a connection to the database could not be established"
}
message = message + ". The system reports: ex.Message"