什么是以编程方式testingSQL Server连接的最佳方法?

我需要开发一个单独的例程,每隔5分钟触发一次,以检查SQL Server(10到12)列表是否已启动并正在运行。

我可以尝试在每个服务器上获得一个简单的查询,但是这意味着我必须在每个服务器上创build一个表,视图或存储过程,即使我使用任何已经创build好的SP,我也需要在每个服务器中注册一个用户服务器也是。 服务器不在同一个物理位置,因此具有这些要求将是一项复杂的任务。 有没有办法简单地从C#一个SQL Server“ping”?

提前致谢!

执行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); } 

不会build立到数据库的连接为你做这个? 如果数据库不在,您将无法build立连接。

在端口1433(默认端口)上查找打开的侦听器。 如果在创build一个tcp连接之后得到任何响应,那么服务器可能会启动。

对于Joel Coehorn的build议,你是否已经尝试过一个名为tcping的工具。 我知道这是你没有以编程方式做的事情。 这是一个独立的可执行文件,它允许你ping每一个指定的时间间隔。 这不是在C#中。 也..我不知道如果这将工作如果目标机器有防火墙..嗯..

[我对这个网站有点新鲜,并且错误地将其添加为评论,现在添加了这个答案。 让我知道如果这可以在这里完成,因为我在这里有重复的评论(作为评论和答案)。 我不能在这里删除评论。]

为什么不直接连接到sql服务器端口上的telnet会话。 如果连接起来,sql server会很好,如果没有的话,那你倒霉了。

这另一个StackOverflow post可能是一个很好的开始。

编辑:好的,现在我已经完全阅读其他post,这不是最好的解决scheme…但是,如果你只是想ping端口….

 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 } 

类似于安德鲁提供的答案,但我使用:

selectGetDate()作为CurrentDate

这使我能够看到SQL Server和客户端在同一个操作中是否有任何时区差异问题。

通过C#连接到mssql是非常有问题的。

一旦我们连接,手柄将不一致,虽然我们有连接后closures连接。

我曾经在某个地方看过.Net 4.0的问题,如果你使用.Net 3.5,它应该没问题。