Каков наилучший способ программного тестирования подключения к SQL Server?
Мне нужно разработать одну процедуру, которая будет запускаться каждые 5 минут, чтобы проверить, работает ли список серверов SQL (от 10 до 12).
Я могу попытаться получить простой запрос на каждом из серверов, но это означает, что мне нужно создать таблицу, представление или хранимую процедуру на каждом сервере, даже если я использую любой уже сделанный SP, мне тоже нужно иметь зарегистрированного пользователя на каждом сервере. Серверы не находятся в одном физическом местоположении, поэтому наличие этих требований будет сложным задача. Есть ли способ просто "пинговать" с C# one SQL Server?
спасибо заранее!
10 ответов:
У меня возникли трудности с EF, когда соединение с сервером остановлено или приостановлено, и я поднял тот же вопрос. Так что для полноты ответов на вышеприведенные вопросы вот код.
/// <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; } } }
смотрите следующий проект на 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); }
разве установление соединения с базой данных не сделает это за вас? Если база данных не вы не сможете установить соединение.
найдите открытый прослушиватель на порту 1433 (порт по умолчанию). Если вы получите какой-либо ответ после создания tcp-соединения там, сервер, вероятно, вверх.
для того, что предложил Джоэл Кохорн, вы уже пробовали утилиту с именем tcping. Я знаю, что это то, что вы не делаете программно. Это автономный исполняемый файл, который позволяет пинговать каждый указанный интервал времени. Это не в C#. Также..Я не уверен, что это будет работать, если целевая машина имеет брандмауэр..хммм..
[Я вроде как новичок на этом сайте и ошибочно добавил Это как комментарий, теперь добавил Это как ответ. Дайте мне знать, если это можно сделать здесь, так как у меня есть дубликаты комментариев (как комментарий и как ответ) здесь. Я не могу удалить комментарии здесь.]
Почему бы просто не подключиться к сеансу telnet на порту sql server. Если он подключается, sql server работает и счастлив, если нет, вам не повезло.
Это другой StackOverflow post может быть хорошим местом, чтобы начать с этого.
изменить: Хорошо, теперь я полностью прочитал другие сообщения, это не совсем лучшее решение... Но если вы просто хотите проверить порт....
public static class SqlConnectionExtension { #region Public Methods public static bool ExIsOpen(this SqlConnection connection, MessageString errorMsg) { if (connection == null) return false; if (connection.State != ConnectionState.Open) { try { connection.Open(); } catch (Exception ex) { errorMsg.Append(ex.ToString()); } } return true; } public static bool ExIsReady(this SqlConnection connction, MessageString 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.ToString()); } return false; } #endregion Public Methods } public class MessageString : IDisposable { #region Protected Fields protected StringBuilder _messageBuilder = new StringBuilder(); #endregion Protected Fields #region Public Constructors public MessageString() { } public MessageString(int capacity) { _messageBuilder.Capacity = capacity; } public MessageString(string 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 string(MessageString ms) { return ms.ToString(); } public static MessageString operator +(MessageString ms1, MessageString ms2) { MessageString ms = new MessageString(ms1.Length + ms2.Length); ms.Append(ms1.ToString()); ms.Append(ms2.ToString()); return ms; } public MessageString Append<T>(T value) where T : IConvertible { _messageBuilder.Append(value); return this; } public MessageString Append(string value) { return Append<string>(value); } public MessageString Append(MessageString ms) { return Append(ms.ToString()); } public MessageString AppendFormat(string format, params object[] args) { _messageBuilder.AppendFormat(CultureInfo.InvariantCulture, format, args); return this; } public MessageString AppendLine() { _messageBuilder.AppendLine(); return this; } public MessageString AppendLine(string value) { _messageBuilder.AppendLine(value); return this; } public MessageString AppendLine(MessageString ms) { _messageBuilder.AppendLine(ms.ToString()); return this; } public MessageString AppendLine<T>(T value) where T : IConvertible { Append<T>(value); AppendLine(); return this; } public MessageString Clear() { _messageBuilder.Clear(); return this; } public void Dispose() { _messageBuilder.Clear(); _messageBuilder = null; } public int EnsureCapacity(int capacity) { return _messageBuilder.EnsureCapacity(capacity); } public bool Equals(MessageString ms) { return Equals(ms.ToString()); } public bool Equals(StringBuilder sb) { return _messageBuilder.Equals(sb); } public bool Equals(string value) { return Equals(new StringBuilder(value)); } public MessageString Insert<T>(int index, T value) { _messageBuilder.Insert(index, value); return this; } public MessageString Remove(int startIndex, int length) { _messageBuilder.Remove(startIndex, length); return this; } public MessageString Replace(char oldChar, char newChar) { _messageBuilder.Replace(oldChar, newChar); return this; } public MessageString Replace(string oldValue, string newValue) { _messageBuilder.Replace(oldValue, newValue); return this; } public MessageString Replace(char oldChar, char newChar, int startIndex, int count) { _messageBuilder.Replace(oldChar, newChar, startIndex, count); return this; } public MessageString Replace(string oldValue, string newValue, int startIndex, int count) { _messageBuilder.Replace(oldValue, newValue, startIndex, count); return this; } public override string ToString() { return _messageBuilder.ToString(); } public string ToString(int startIndex, int length) { return _messageBuilder.ToString(startIndex, length); } #endregion Public Methods }