"У меня есть глобальный SqlDataAdapter" - это ваша ошибка. Избавьтесь от этого понятия и создайте DataAdapter всякий раз, когда вы захотите его использовать. Поместите его в оператор using
, чтобы не забыть его утилизировать.
Кроме того, если вы кэшируете соединения и открываете их закрытие вручную, тоже не делайте этого - просто дайте адаптеру (что вы делаете на месте) строку SQL и строку подключения, и пусть она создает объекты подключения и команды. Единственный раз, когда вы захотите создать соединение и открыть его самостоятельно, это если у вас есть много операций, которые нужно выполнить последовательно с использованием различных адаптеров, возможно, как часть транзакции. Не забывайте, что открытие и закрытие соединения не обязательно делает TCP-соединение с базой данных (медленным) - это аренда и возврат текущего и пригодного для использования соединения из пула соединений и является тривиальной операцией
Чем больше вы пытаетесь справиться с этим, тем хуже будет становиться и пытаться покачиваться, обнаруживать это и ждать, что это а) ненужно, б) хакерский беспорядок, чтобы попытаться обойти тот угол, в который вы покрасили себя, c) собираюсь дать некачественный пользовательский интерфейс.