If I was doing all the work myself I would tend to put the code for creating connections, commands etc. into a class of it's own and call this class from the slightly higher level methods like getReceiptsTotal etc.
This class would have fairly simple methods like GetConnection() which would just return a valid connection object and slightly more complex methods such as GetCommand or GetReader which would return the corresponding object based on parameters passed in. Typically I would overload these to cover the most common scenarios.
http://www.microsoft.com/downloads/details.aspx?familyid=f63d1f0a-9877-4a7b-88ec-0426b48df275&displaylang=en can be used as a model (or even as is) as it covers the most common scenarios.
Opening and closing a connection every time isn't that big an overhead due to connection pooling being used behind the scenes to reduce the actual connections being really created and destroyed - and very slight performance hit is far outweighed by the fact you aren't leaking connections. One thing I would tend towards though is the using statement as this will make sure connections are closed even when exceptions are thrown.
Other than that I would really avoid using string concatenation to build your queries, parameterised queries are far safer and can be converted to stored procedures if need be with very little effort. http://www.xtremedotnettalk.com/showthread.php?p=463520#post463520 has a bit more background on other reasons why concatenation is a bad thing...