Ответ 1
Выполнить SELECT 1
и проверить, возвращает ли ExecuteScalar 1.
Мне нужно разработать единую процедуру, которая будет запускаться каждые 5 минут, чтобы проверить, запущен и запущен список SQL-серверов (от 10 до 12).
Я могу попытаться получить простой запрос на каждом из серверов, но это означает, что мне нужно создать таблицу, просмотр или хранимую процедуру на каждом сервере, даже если я использую любой уже сделанный SP. Мне нужно иметь зарегистрированный пользователя на каждом сервере. Серверы не находятся в одном и том же физическом местоположении, поэтому эти требования будут сложной задачей. Есть ли способ просто "ping" с С# one SQL Server?
Спасибо заранее!
Выполнить SELECT 1
и проверить, возвращает ли ExecuteScalar 1.
У меня возникли трудности с 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. Я знаю, что это то, что вы не делаете программным путем. Это автономный исполняемый файл, который позволяет вам пинговать каждый заданный интервал времени. Однако это не в С#. Также.. Я не уверен, если это будет работать Если на целевой машине есть брандмауэр..hmmm..
[Я новичок на этом сайте и ошибочно добавил это как комментарий, теперь добавил это как ответ. Дайте мне знать. Если это можно сделать здесь, так как здесь есть дубликаты комментариев (как комментарий и как ответ). Я не могу удалять комментарии здесь.]
Почему бы просто не подключиться к сеансу telnet на порту сервера sql. Если он подключается, сервер sql работает и счастлив, если нет, вам не повезло.
Этот другой StackOverflow post может быть хорошим местом для начала.
EDIT: Хорошо, теперь я полностью прочитал другие сообщения, это не совсем лучшее решение... Тем не менее, если вы просто хотите пинговать порт...
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
}
Подобно предложению Эндрю, но я использую:
Выберите GetDate() как CurrentDate
Это позволяет мне увидеть, имеют ли SQL Server и клиент какие-либо проблемы разности часовых поясов, в том же самом действии.
Подключение к mssql через С# очень проблематично.
Ручки не будут согласованы после подключения, хотя мы закрываем соединение после подключения.
Я прочитал где-то это .Net 4.0, и если вы используете .Net 3.5, это должно быть нормально.