Quelle est la meilleure façon de tester la connection SQL Server par programme?

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

Je peux essayer d'get une requête simple dans chacun des servers, mais cela signifie que je dois créer une table, une vue ou une procédure stockée dans chaque server, même si j'utilise un SP déjà créé. server aussi. Les servers ne se trouvent pas dans le même location physique, de sorte que ces exigences seraient une tâche complexe. Y at-il un moyen de simplement "ping" de C # un SQL Server?

Merci d'avance!

Exécutez SELECT 1 et vérifiez si ExecuteScalar renvoie 1.

J'ai eu un problème avec l'EF lorsque la connection du server est arrêtée ou en pause, et j'ai soulevé la même question. Donc, pour être complet aux réponses ci-dessus, voici le code.

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

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

 try { Console.WriteLine("Connecting to: {0}", AppConfig.ConnectionSsortingng); using (var connection = new SqlConnection(AppConfig.ConnectionSsortingng)) { 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); } 

N'établirait-il pas une connection à la database pour vous? Si la database n'est pas active, vous ne pourrez pas établir de connection.

Recherchez un écouteur ouvert sur le port 1433 (le port par défaut). Si vous obtenez une réponse après avoir créé une connection TCP, le server est probablement en hausse.

Pour ce que Joel Coehorn a suggéré, avez-vous déjà essayé l'utilitaire nommé tcping . Je sais que c'est quelque chose que vous ne faites pas par programme. C'est un exécutable autonome qui vous permet de faire un ping à chaque intervalle de time spécifié. Ce n'est pas en C # cependant. Aussi .. Je ne suis pas sûr Si cela fonctionnerait Si la machine cible a un pare-feu .. hmmm ..

[Je suis un peu nouveau sur ce site et ajouté par erreur comme un commentaire, maintenant ajouté cela comme une réponse. Faites le moi savoir Si ceci peut être fait ici car j'ai des commentaires en double (comme commentaire et comme réponse) ici. Je ne peux pas supprimer les commentaires ici.]

Pourquoi ne pas simplement se connecter à la session telnet sur le port du server SQL. S'il se connecte, le server SQL est en place et heureux, sinon, vous n'avez pas de chance.

Cet autre article de StackOverflow pourrait être un bon sharepoint départ.

EDIT: OK, maintenant j'ai complètement lu les autres messages ce n'est pas exactement la meilleure solution … Pourtant, si vous voulez juste cingler le port ….

 public static class SqlConnectionExtension { #region Public Methods public static bool ExIsOpen(this SqlConnection connection, MessageSsortingng errorMsg) { if (connection == null) return false; if (connection.State != ConnectionState.Open) { try { connection.Open(); } catch (Exception ex) { errorMsg.Append(ex.ToSsortingng()); } } return true; } public static bool ExIsReady(this SqlConnection connction, MessageSsortingng errorMsg) { if (ExIsOpen(connction, errorMsg) == false) return false; try { using (SqlCommand command = new SqlCommand("select 1", connction)) using (SqlDataReader reader = command.ExecuteReader()) if (reader.Read()) return true; } catch (Exception ex) { errorMsg.Append(ex.ToSsortingng()); } return false; } #endregion Public Methods } public class MessageSsortingng : IDisposable { #region Protected Fields protected SsortingngBuilder _messageBuilder = new SsortingngBuilder(); #endregion Protected Fields #region Public Constructors public MessageSsortingng() { } public MessageSsortingng(int capacity) { _messageBuilder.Capacity = capacity; } public MessageSsortingng(ssortingng value) { _messageBuilder.Append(value); } #endregion Public Constructors #region Public Properties public int Length { get { return _messageBuilder.Length; } set { _messageBuilder.Length = value; } } public int MaxCapacity { get { return _messageBuilder.MaxCapacity; } } #endregion Public Properties #region Public Methods public static implicit operator ssortingng(MessageSsortingng ms) { return ms.ToSsortingng(); } public static MessageSsortingng operator +(MessageSsortingng ms1, MessageSsortingng ms2) { MessageSsortingng ms = new MessageSsortingng(ms1.Length + ms2.Length); ms.Append(ms1.ToSsortingng()); ms.Append(ms2.ToSsortingng()); return ms; } public MessageSsortingng Append<T>(T value) where T : IConvertible { _messageBuilder.Append(value); return this; } public MessageSsortingng Append(ssortingng value) { return Append<ssortingng>(value); } public MessageSsortingng Append(MessageSsortingng ms) { return Append(ms.ToSsortingng()); } public MessageSsortingng AppendFormat(ssortingng format, params object[] args) { _messageBuilder.AppendFormat(CultureInfo.InvariantCulture, format, args); return this; } public MessageSsortingng AppendLine() { _messageBuilder.AppendLine(); return this; } public MessageSsortingng AppendLine(ssortingng value) { _messageBuilder.AppendLine(value); return this; } public MessageSsortingng AppendLine(MessageSsortingng ms) { _messageBuilder.AppendLine(ms.ToSsortingng()); return this; } public MessageSsortingng AppendLine<T>(T value) where T : IConvertible { Append<T>(value); AppendLine(); return this; } public MessageSsortingng Clear() { _messageBuilder.Clear(); return this; } public void Dispose() { _messageBuilder.Clear(); _messageBuilder = null; } public int EnsureCapacity(int capacity) { return _messageBuilder.EnsureCapacity(capacity); } public bool Equals(MessageSsortingng ms) { return Equals(ms.ToSsortingng()); } public bool Equals(SsortingngBuilder sb) { return _messageBuilder.Equals(sb); } public bool Equals(ssortingng value) { return Equals(new SsortingngBuilder(value)); } public MessageSsortingng Insert<T>(int index, T value) { _messageBuilder.Insert(index, value); return this; } public MessageSsortingng Remove(int startIndex, int length) { _messageBuilder.Remove(startIndex, length); return this; } public MessageSsortingng Replace(char oldChar, char newChar) { _messageBuilder.Replace(oldChar, newChar); return this; } public MessageSsortingng Replace(ssortingng oldValue, ssortingng newValue) { _messageBuilder.Replace(oldValue, newValue); return this; } public MessageSsortingng Replace(char oldChar, char newChar, int startIndex, int count) { _messageBuilder.Replace(oldChar, newChar, startIndex, count); return this; } public MessageSsortingng Replace(ssortingng oldValue, ssortingng newValue, int startIndex, int count) { _messageBuilder.Replace(oldValue, newValue, startIndex, count); return this; } public override ssortingng ToSsortingng() { return _messageBuilder.ToSsortingng(); } public ssortingng ToSsortingng(int startIndex, int length) { return _messageBuilder.ToSsortingng(startIndex, length); } #endregion Public Methods } 

Similaire à la réponse proposée par Andrew, mais j'utilise:

Sélectionnez GetDate () comme CurrentDate

Cela me permet de voir si le server SQL et le client ont des problèmes de différence de timezone, dans la même action.

La connection à mssql via C # est très problématique.

Les poignées ne seront pas cohérentes une fois que nous nous serons connectés, bien que nous ayons fermé la connection après la connection.

J'ai lu quelque part que c'était le problème .Net 4.0, et si vous utilisez .Net 3.5 ça devrait aller.