У нас есть внутреннее приложение (Толстый клиент), которое зависит от нашего центрального SQL-сервера. Приложение представляет собой настольное приложение, которое позволяет пользователям работать в автономном режиме (например, Outlook). Что мне нужно сделать, так это способ точно определить, доступен SQL или нет.
Что у меня есть до сих пор:
В настоящее время я использую следующий метод -->
internal static void CheckSQLAvailability()
{
using (TcpClient tcpc = new TcpClient())
{
try
{
tcpc.Connect(Settings.Default.LiveSQLServer, Settings.Default.LiveSQLServerPort);
IsSQLAvailable = true;
}
catch
{
IsSQLAvailable = false;
}
}
}
Я не в восторге от этого подхода по следующим причинам.
- Склонен к ложноотрицательным результатам
- Необходимо вызывать "вручную"
- Выглядит "вонючим" (попробовать/поймать)
Я думал использовать таймер и просто вызывать это каждые X (3 ??) минут, а также, если результат отрицательный, попробовать второй раз, чтобы уменьшить количество ложных срабатываний.
Здесь есть аналогичный вопрос -->Определение, работает ли SQL-сервер, но он отличается от моего вот чем:
- Я проверяю только 1 сервер
- Я ищу реактивный способ против проактивного
Итак, в конце концов, есть ли более элегантный способ сделать это? Все это будет обнаружение «внутри сети».
P.S. Чтобы предложить некоторый фон, как запрошено в ответе ниже: Мое приложение — это базовое приложение CRUD, которое может подключаться к нашему центральному серверу SQL или локальному серверу SQLExpress. У меня есть модуль репликации слиянием, который синхронизирует их, а DAL привязан к значению User.Setting
. Я уже могу вручную переключать их с центрального на локальный и обратно. Я просто хочу реализовать способ, чтобы он делал это автоматически. У меня есть класс NetworkChangeDetection
, который работает достаточно хорошо, но, очевидно, не обнаруживает удаленные SQL.