If the data being retrieved is user specific, consider using Session. If it's the same data shared among all users, consider using the cache.
I'd discourage using view state to cache database results because it quickly inflates the size of the rendered markup. On top of that, view state content must not only be downloaded but also is POSTed back to the server when the form is submitted, so with view state you pay the performance penalty twice.
Another option you didn't mention is to use the HttpContext.Items collection. This makes for a great way to cache database data per-request. This technique is quite helpful if you have many separate modules in a page (such as the master page and User Controls) that are retrieving the same data, as it allows that data to be requested once and then cached for the lifetime of that particular request. For more information, refer to HttpContext.Items - a Per-Request Cache Store.