В своих проектах я обычно решаю эту проблему, создавая служебный класс, который содержит все методы для доступа к БД и управления всем, что связано с подключением к БД и адаптером.
Например, класс DBSql, который содержит соединение (соединение SqlConnection;) в качестве закрытого члена и следующие методы:
//execute the query passed to the function
public System.Data.DataSet ExecuteQuery(string query)
//returns if a query returns rows or not
public bool HasRows(string query)
//execute commands like update/insert/etc...
public int ExcuteNonQuery(string sql)
В моем классе вы просто передаете строку, и класс инициализирует различные DataAdapter и Command для его выполнения и возвращает набор данных. Очевидно, вы можете усложнить управление параметрами / транзакцией и всем остальным.
Таким образом, вы уверены, что соединение и объект всегда обрабатываются одинаково, и, надеюсь, правильно.