I'll expand just a bit, and say that it's simply a question of scalability and site traffic.
The more you bits you have in memory, the slower your site will run. You won't notice the performance hit until you get to a certain level of used memory, though.
So then, if you have a relatively low traffic site (and IMHO, most ppl do -- contrary to what we sometimes like to believe), then chances are that you won't get to that level, and therefore storing a dataset in session would be ok.
If you build your site using this methodology, your site would not be very "scaleable", to use one of our latest buzz words, because as the level of traffic grew, the number of datasets would grow in the same proportion as the number of users, and you would run out of resources much faster than someone who implemented some other methodology w/o using session at all.
In the latter case, the data is kept mostly on the client (the variables, that is) and they are passed back and forth on postbacks. In this way, as your number of users increased, the amount of resources it takes to support them increases by some factor less than your user n increase.
Here's one fact to consider: Data access (especially to SQL Server) has been vastly improved, as well as every aspect (string concat for the sql stmts, connection pooling, etc...) that it takes to get to that magic moment of data access. Due to this, hitting the database repeatedly for the same data just doens't cost as much as it used to. This would be another argument for the latter case from above.
So... is it a hard and fast rule NEVER to do this? No.
Is it a "best practice"? No.
Should we teach a beginner to do things in this way? IMHO, No.
As an experienced developer who knows his/her site's needs and limitations, should we be able to use this method if we know what the cost is? Yes -- w/o question, we should.
----------------
As for the not teaching beginners this method comment, I hate to go against Dino Esposito (and many others) here, but I just don't know why they do that. There's so much confusion because not only do they do it, but they don't even mention (in many cases) the cost of doing so. They are building simple little apps for examples and they do it because it's quick and easy. They don't take into account that they really should be employing "best practices" whenever possible and reasonable because ppl will take those little building blocks and try to build big apps out of them. It's shorsighted on their part to do it. I actually asked this question of Dino at a recent conference I attended because he was showing the exact same method at a session, and he said "Well, this is for a small example app.", or something to that effect. So it's not that they think it's great or anything... just that they sometimes get a little lazy in coding like the rest of us.
Personally, I don't do this. I abstract the logic of creating the datasets (or whatever) into re-useable classes and simply call them on each page. So my dev time is exactly the same either way, which is why I might as well choose the more scaleable method -- given the choice. And that's what I preach. That doesn't make it right, and it doesn't make it wrong. It just makes it what so many other things are -- developer's choice. They key is just to know what you're writing into your apps to make sure they fit the requirements... everything else is pure preference.
hth

paul