Have you looked at LINQ-to-SQL (wouldn't recommend this though, it's not going to get much attention from Microsoft in the future), LINQ-to-Entities (this is what Microsoft is dedicating resources to in this area for the foreseeable future), NHibernate, or any other ORM(-ish) libraries for .NET?
Any of them will have mechanisms to allow you to create your queries (in a more typesafe way, I might add) and get the results back in an object form (or get results from procedures if you are dealing with scalar results).
Now, it is the case that it doesn't allow you to pass the query string, but if you are dynamically generating this, then more often than not, that's a really bad thing, as most composed dynamic SQL statements, if not using parameters (which you aren't indicating you are) are subject to SQL injection attacks.
When using any of the libraries above, you can compose your query, and the parameters will be parsed and the dynamic sql under the covers will be generated safely, not subject to SQL injection attacks.