Depends on the case, but on legacy systems where I wan't to stub out the database I often introduce an interface, lets say IFooDBManager that has methods that return ADO.Net entities, like data tables or data sets. Of course it doesn't have to be an interface, but it could be a virtual method for example. Then, in my tests, I use a small API with a fluent interface that I built myself a long time ago, I use this for creating data sets and tables and filling them with test values so that I can return them from my fakes.
The fluent interface looks something like this:
return DataTableBuilder.Create()
.DefineColumns("a, b")
.AddRow().SetValue("a", 1).SetValue("b", 2).DoneWithRow()
.AddRow().SetValue("a", 10).SetValue("b", 20).DoneWithRow()
.Table
As I said, this is just one of the approaches I use, and this is mainly for legacy systems where I don't want to introduce new dependencies on frame works and such. This is however a technique I haven't seen a lot of other people use so I thought it'd be worth mentioning.
EDIT:
I forgot to clarify that this is for stubbing out the database, so the interaction with the database is not tested in this case. The actual interaction will take place in the concrete implementation of IFooDBManager, to test that something else completely is needed.
Also, not all methods on such an interface returns things of course, there are also methods for writing to the database and these I usually test by interaction testing in RhinoMocks where I set expectations on these methods.