<p>Where should I be logging exceptions? At the data service tier(ExecuteDataSet, etc.) and/or at the data access layer and/or at the business layer?</p>

If you are throwing the exception you should log it when it occurs and then  bubble it up.  Otherwise only the end user should log an exception (you may have lots of tracing on of course in which case it may get logged quite a bit).
The end user may be a UI component or a Service or something...
If you handle an exception in you code somewhere - then that is the end user and you should log it there.  In most apps and in most cases it should be logged by the UI when it displays the error message to the user.