Как эффективно проверить, работает ли экземпляр SQL Server в C # - PullRequest
0 голосов
/ 16 февраля 2012

У меня есть приложение на основе SQL Server (2008 R2) (C # WinForms), которое преимущественно работает на локальном компьютере с использованием локальной установки SQL Server 2008 R2. У меня есть одна проблема: если у пользователя нет запущенного экземпляра сервера, и он пытается выполнить некоторые команды или выполнить некоторые операции, запросы отправляются на SQL Server, и требуется время, чтобы вывести SqlException, сообщая мне запрошенный экземпляр не запущен.

Я прочитал следующий вопрос и связанные с ним ответы , но эти решения далеки от идеальных. WMI кажется чрезмерным уничтожением, и я не хочу включать дополнительные .dll в мой установочный пакет для программного обеспечения, если этого можно избежать.

Я также натолкнулся на класс SqlDataSourceEnumerator, задокументированный здесь

// Retrieve the enumerator instance and then the data.
SqlDataSourceEnumerator instance = SqlDataSourceEnumerator.Instance;
System.Data.DataTable table = instance.GetDataSources();

, который сбрасывает доступное соединение в DataTable. Однако при возврате всех доступных соединений возникают проблемы:

"All of the available servers may or may not be listed. The list can vary depending on 
 factors such as timeouts and network traffic. This can cause the list to be different 
 on two consecutive calls." - MSDN.

Должен быть установленный способ решения этой проблемы. Скажем, у меня есть следующая строка SqlConnection:

Data Source=localhost;Initial Catalog=MyDB;Integrated Security=True;Connection Timeout = 0

что я могу использовать в качестве эффективной (это важно) проверки того, запущен ли выбранный экземпляр («localhost» [экземпляр по умолчанию] или «SomeInstanceName»)?

Спасибо за ваше время.

Ответы [ 5 ]

2 голосов
/ 16 февраля 2012

Я не думаю, что вам нужно беспокоиться о тайм-аутах или проблемах сети, когда сервер и клиент находятся на одной машине.Простая попытка установить соединение - это эффективная задача, которую вы собираетесь получить, и решающим моментом будет то, как долго вы разрешаете попытку подключения, прежде чем прекратите (время ожидания соединения).Очевидно, что вы можете сократить это окно, но если вы сделаете его слишком коротким, тогда проблема на самом деле не имеет смысла.

1 голос
/ 23 сентября 2015

Если вам известно имя экземпляра, например, «MSSQL $ InstanceName», вы можете использовать класс System.ServiceProcess.ServiceController, чтобы получить список всех служб на компьютере, а затем просмотреть все сервисные имена == MSSQL. $ InstanceName.

Я обнаружил, что это очень быстро, плюс вы можете проверить, работает ли он, и запустить его, если он не работает.

1 голос
/ 16 февраля 2012

Вы можете изменить время ожидания соединения на более короткий период, но, по сути, единственный способ узнать, что сервера нет, это время ожидания.

1 голос
/ 16 февраля 2012

Любая используемая вами техника, скорее всего, будет иметь ту же проблему с тайм-аутом.

0 голосов
/ 16 февраля 2012

Вы можете попробовать открыть простое TCP-соединение со стандартным портом SQL и посмотреть, не торчит ли он. установите для тайм-аута соединения какое-то достаточно низкое значение в зависимости от вашей среды.

см.

http://support.microsoft.com/kb/287932

для номеров портов sql serevr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...