100 votes

Quelle est la meilleure façon de tester la connexion au serveur SQL de manière programmatique ?

J'ai besoin de développer une routine unique qui sera lancée toutes les 5 minutes pour vérifier si une liste de serveurs SQL (10 à 12) est opérationnelle.

Existe-t-il un moyen de simplement " ping " un serveur SQL à partir de C# one avec un minimum de code et d'exigences opérationnelles sql ?

2 votes

Il ne suffit pas d'envoyer une requête ping au serveur, il est possible que le serveur fonctionne mais que l'instance SQL soit arrêtée. La meilleure solution consiste à créer une connexion ado.net réelle à l'instance.

0 votes

Saviez-vous que vous aviez le seulement question sur le site étiqueté mssql parmi plus d'un demi-million d'autres questions ? Vous pensez vraiment que c'est une bonne étiquette ? Vous êtes ici depuis assez longtemps pour le savoir.

2 votes

Comme vous le savez, il y a une grande différence entre MS-SQL et SQL-server, surtout si l'on parle de ports et de pinging. Quelle démocratie, tout le monde doit utiliser la même balise. Pas d'options ! Vous pouvez ajouter un autre tag, cela ne pose aucun problème, mais pourquoi supprimer celui que j'ai choisi ? ! !!!

111voto

peteringermany Points 436

J'ai eu une difficulté avec le EF lorsque la connexion le serveur est arrêté ou en pause, et j'ai soulevé la même question. Donc pour compléter les réponses ci-dessus, voici le code.

/// <summary>
/// Test that the server is connected
/// </summary>
/// <param name="connectionString">The connection string</param>
/// <returns>true if the connection is opened</returns>
private static bool IsServerConnected(string connectionString)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        try
        {
            connection.Open();
            return true;
        }
        catch (SqlException)
        {
            return false;
        }
    }
}

15 votes

Pas besoin de la connection.Close(); dans ce cas, le using clause le fera pour vous à la fin du contrat.

4 votes

Vous devez placer le try catch en dehors de l'instruction using. ( stackoverflow.com/q/4590490/1248177 ou stackoverflow.com/q/6145245/1248177 ).

1 votes

@aloisdg - Cela dépend, n'est-ce pas ? Est-ce qu'ils testent pour voir s'ils peuvent se connecter à une base de données et seulement dans les circonstances exceptionnelles où ils ne peuvent pas, ils retournent false. Ou veulent-ils aussi avaler les exceptions liées à la construction incorrecte d'une connexion SQL ? Je sais qu'il y a une différence car je viens de coder contre ce qui précède.

89voto

Andrew Bezzub Points 8794

Exécuter SELECT 1 et vérifier si ExecuteScalar retourne 1.

1 votes

C'est très bien, pas besoin d'avoir un objet créé dans une base de données, mais j'ai besoin d'avoir une base de données et un utilisateur pour faire une requête. Je veux juste savoir si le service est en place sur le port MSSQL. Quoi qu'il en soit, vous résolvez presque 75% du problème. Ce serait une option.

6 votes

Vous avez la base de données principale de toute façon :) Le moyen le plus simple de vérifier si le serveur SQL fonctionne est de s'y connecter. Pour vous connecter, vous avez besoin de la base de données et du login. Toutes les autres solutions (comme pinging le port du serveur SQL) ne garantissent pas que le serveur SQL fonctionne correctement et que n'importe qui peut s'y connecter.

0 votes

J'ai accidentellement rétrogradé cette réponse alors que mon intention réelle était de l'augmenter. J'ai réalisé cela un jour après, donc je ne peux plus réparer mon erreur.

16voto

ghuntley Points 66

Voir le projet suivant sur GitHub : https://github.com/ghuntley/csharp-mssql-connectivity-tester

try
{
    Console.WriteLine("Connecting to: {0}", AppConfig.ConnectionString);
    using (var connection = new SqlConnection(AppConfig.ConnectionString))
    {
        var query = "select 1";
        Console.WriteLine("Executing: {0}", query);

        var command = new SqlCommand(query, connection);

        connection.Open();
        Console.WriteLine("SQL Connection successful.");

        command.ExecuteScalar();
        Console.WriteLine("SQL Query execution successful.");
    }
}
catch (Exception ex)
{
    Console.WriteLine("Failure: {0}", ex.Message);
}

7voto

Ken Henderson Points 2229

L'établissement d'une connexion à la base de données ne ferait-il pas cela pour vous ? Si la base de données n'est pas en service, vous ne pourrez pas établir de connexion.

0 votes

En effet, il suffit d'utiliser ADO net pour se connecter - s'il n'y a pas de réponse dans le délai imparti, la base de données n'est pas disponible. Vous n'avez pas besoin de lancer une requête pour vous en assurer.

0 votes

Pour vérifier avec ADO.NET j'ai besoin d'un utilisateur, je veux juste vérifier si le service est opérationnel, pas de problème pour savoir si une base de données est opérationnelle. J'ai besoin de quelque chose comme telnet un serveur SMTP. Pas besoin d'avoir un utilisateur pour obtenir une réponse.

3 votes

@backslash17 : La réponse "Login failed for user..." devrait être suffisante pour confirmer que 1) la machine est en marche et 2) le service est en cours d'exécution. Si vous obtenez un délai de connexion, alors le service ne fonctionne pas.

2voto

Joel Coehoorn Points 190579

Recherchez un listener ouvert sur le port 1433 (le port par défaut). Si vous obtenez une réponse après avoir créé une connexion tcp à cet endroit, le serveur est probablement opérationnel.


Tu sais, j'ai écrit ça pour la première fois en 2010. Aujourd'hui, j'essaierais juste de se connecter réellement au serveur .

0 votes

Pour ce que Joel Coehorn a suggéré, avez-vous déjà essayé tcping [ [elifulkerson.com/projets/tcping.php]](http://www.elifulkerson.com/projects/tcping.php]) . Il s'agit d'un exécutable autonome qui vous permet d'envoyer un ping à chaque intervalle de temps spécifié. Il n'est pas en C# cependant. Aussi Je ne suis pas sûr que cela fonctionnerait si la machine cible a un pare-feu hmmm

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X