I'd start with this article from MSDN. There is no 'right' way to do this, just lots of solutions each with different benefits.
I find that typed datasets are handy for smaller applications, but the number of data adapters you end up writing can balloon when the app grows. Datasets have the advantage of keeping track of their own 'dirty' state so updating the data source is relatively easy.
On the other hand, custom data objects free you from the database schema, so you can architect your application for the best solution, rather than accidentally architecting it around the database. With custom data objects you have to keep track of the dirtyness yourself. CSLA.NET is one library you might want to look at if you're going with custom business objects.
Essentially, it's too big a question to answer easily!
Herbie