Какой самый быстрый способ проверить доступность сервера SQL? - PullRequest
5 голосов
/ 15 июля 2010

Какой лучший способ проверить, существует сервер SQL или нет?

Я пытаюсь использовать Microsoft.SqlServer.Management.Smo.Server.PingSqlServerVersion (). и он работает нормально, если сервер существует и доступен. Но это довольно медленно, если такого сервера нет.

Существует ли достаточно быстрый способ проверки, даже не определяя учетные данные пользователя (только имя сервера), если сервер существует?

Что вы рекомендуете использовать?

Ответы [ 5 ]

5 голосов
/ 15 июля 2010

Вы все еще можете использовать Microsoft.SqlServer.Management.Smo.Server.PingSqlServerVersion(), но использовать его асинхронно.Например, вы можете позвонить через класс BackWorker .Событие DoWork будет вызывать Microsoft.SqlServer.Management.Smo.Server.PingSqlServerVersion().RunWorkerCompleted просто установит логическую переменную в true.Таким образом, вы можете запустить его, подождать сколько угодно, проверить логическое значение, и если оно не соответствует действительности, вы будете знать, что сервер SQL еще не ответил, и вы можете отменить BackgroundWorker.

4 голосов
/ 15 июля 2010

Вы можете просто использовать класс TcpClient , чтобы запросить сервер и проверить, открыт ли определенный порт, может быть что-то вроде этого:

using System.Net;
using System.Net.Sockets;

public bool CheckServerAvailablity(string serverIPAddress, int port)
{
  try
  {
    IPHostEntry ipHostEntry = Dns.Resolve(serverIPAddress);
    IPAddress ipAddress = ipHostEntry.AddressList[0];

    TcpClient TcpClient = new TcpClient();
    TcpClient.Connect(ipAddress , port);
    TcpClient.Close();

    return true;
  }
  catch
  {
    return false;
  }
} 
3 голосов
/ 15 июля 2010

Вы можете попробовать открыть tcp-сокет для порта 1433 (порт sql по умолчанию) с коротким таймаутом и посмотреть, отвечает ли он.

Для этого на сервере SQL должен быть включен протокол TCP / IP.

1 голос
/ 15 июля 2010

Чтобы добавить к Микаэлю, вы также можете сначала пропинговать хост, так как он будет реагировать быстрее, если сервер не работает.

Конечно, все это предполагает, что вы пытаетесь получить доступ к удаленному серверу по TCP / IP.

0 голосов
/ 03 июля 2015

После использования ответа Бена Робинсона я придумал это, и оно хорошо работает для меня.Я использовал строку подключения, чтобы открыть, а затем закрыть соединение в блоке try, но когда я работал в Windows 8.1, исключение не было обнаружено, и программа вылетала.

public unsafe bool OdbcConnectionTest(string sConnectionString
    , out int actualTimeMs)
{
    DateTime dtme = DateTime.Now;
    OdbcConnectionStringBuilder con;
    Microsoft.SqlServer.Management.Smo.Server svr;
    Microsoft.SqlServer.Management.Common.ServerVersion sVer;
    Microsoft.SqlServer.Management.Smo.Database db;
    try
    {
        con = new System.Data.Odbc.OdbcConnectionStringBuilder(sConnectionString);
        object sServer;
        if (con.TryGetValue("server", out sServer))
        {
            svr = new Microsoft.SqlServer.Management.Smo.Server((string)sServer);
            if (svr != null)
            {
                sVer = svr.PingSqlServerVersion((string)sServer);
                if (sVer != null)
                {
                    object sDb;
                    if (con.TryGetValue("database", out sDb))
                    {
                        if (!String.IsNullOrWhiteSpace((string)sDb))
                        {
                            db = svr.Databases[(string)sDb];
                            if (db != null && db.IsAccessible)
                            {
                                TimeSpan ts = DateTime.Now - dtme;
                                actualTimeMs = (int)ts.TotalMilliseconds;
                                return true;
                            }
                        }
                    }
                }
            }
        }
    }
    catch 
    {
        actualTimeMs = -1;
        return false;
    }
    actualTimeMs = -1;
    return false;
}
...