Я думаю, что выбранный вами подход не очень хорош.
Если ваше приложение представляет собой какую-то запланированную работу, дайте ему сбой. Нет базы данных - никакая работа не может быть выполнена. Это нормально для сбоя в этом случае. В следующий раз, когда он запустится, а БД встанет, он сделает свое дело. Вы также можете выполнить повторные попытки.
Если ваше приложение является службой Windows внутри и имеет какой-то запланированный таймер, вы просто убедитесь, что ваша служба не дает сбоя, обрабатывая SqlExcpetion. Повторите попытку, пока сервер не будет запущен.
Кроме того, вы можете использовать распределенные транзакции. Чтобы гарантировать целостность процедуры копирования, но нужно ли вам это или нет, зависит от требований.
[Изменить] В ответ на повторный вопрос.
var attemptNumber = 0;
while (true)
{
try
{
using (var connection = new SqlConnection())
{
connection.Open();
// do the job
}
break;
}
catch (SqlException exception)
{
// log exception
attemptNumber++;
if (attemptNumber > 3)
throw; // let it crash
}
}