I wrote a DAL object that can translate any database result to any specified entity. This is the best way for my needs. Beyond syntactic rules imposed by the language and framework you're using, pretty much everything you read about programming are to be treated as mere suggestions or guidelines - even when they're called a "best practice".
A good programmer will not only know what his options are when approaching a problem, but he'll be willing and able to implement what works best for the code for a given project. Once he is able to do this, arguments about abstract classes vs interfaces, or returning a dataset or a datatable, or how to implement a threading model fall to the wayside, because decisions have to be made, and the project has to be completed. In other words, you have to make a call, regardless of what other people might think, because YOU are the one writing the code.
Here are some rules I live by:
0) Start all lists with 0 (because real programmers deal with zero-indexed lists on a daily basis.
1) NEVER use a goto. They're evil hold-overs based on based ideas from a less enlightened era.
2) Don't tug on Superman's cape.
3) Don't spit into the wind.
4) Don't pull the mask off that old Lone Ranger.
5) Don't mess around with Jim.
Here's an article from which I think you might benefit.
Being a Programmer[
^]