Ich muss eine einzelne Routine entwickeln, die alle 5 Minuten ausgelöst wird, um zu überprüfen, ob eine Liste von SQL-Servern (10 bis 12) aktiv ist.
Ich kann versuchen, auf jedem Server eine einfache Abfrage zu erhalten. Dies bedeutet jedoch, dass ich auf jedem Server eine Tabelle, eine Ansicht oder eine gespeicherte Prozedur erstellen muss, auch wenn ich einen bereits erstellten SP verwende, muss auf jedem Server ein registrierter Benutzer vorhanden sein Server auch. Die Server befinden sich nicht am selben physischen Standort, daher wäre es eine komplexe Aufgabe, diese Anforderungen zu erfüllen. Gibt es eine Möglichkeit, einfach von C # one SQL Server aus zu "pingen"?
Danke im Voraus!
c#
sql-server
database-connectivity
Backslash17
quelle
quelle
mssql
die von mehr als einer halben Million anderer Fragen markiert wurde? Glaubst du wirklich, dass das ein guter Tag ist? Sie sind schon lange genug hier, um es besser zu wissen.Antworten:
Ausführen
SELECT 1
und prüfen, ob ExecuteScalar 1 zurückgibt.quelle
Ich hatte Probleme mit der EF, als die Verbindung zum Server gestoppt oder unterbrochen wurde, und habe dieselbe Frage aufgeworfen. Der Vollständigkeit halber finden Sie hier den 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; } } }
quelle
connection.Close();
In diesem Fall ist dies nicht erforderlich. Dieusing
Klausel erledigt dies bei Kündigung für Sie.Siehe das folgende Projekt auf 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); }
quelle
Würde dies nicht für Sie eine Verbindung zur Datenbank herstellen? Wenn die Datenbank nicht aktiv ist, können Sie keine Verbindung herstellen.
quelle
Suchen Sie nach einem offenen Listener an Port 1433 (dem Standardport). Wenn Sie nach dem Erstellen einer TCP-Verbindung eine Antwort erhalten, ist der Server wahrscheinlich in Betrieb.
quelle
Für das, was Joel Coehorn vorgeschlagen, haben Sie bereits das Programm mit dem Namen versucht TCPing . Ich weiß, dass Sie dies nicht programmgesteuert tun. Es ist eine eigenständige ausführbare Datei, mit der Sie jedes angegebene Zeitintervall anpingen können. Es ist jedoch nicht in C #. Ich bin mir nicht sicher, ob dies funktionieren würde, wenn der Zielcomputer eine Firewall hat.
[Ich bin ein bisschen neu auf dieser Seite und habe dies fälschlicherweise als Kommentar hinzugefügt, jetzt als Antwort. Lassen Sie mich wissen, ob dies hier möglich ist, da ich hier doppelte Kommentare (als Kommentar und als Antwort) habe. Ich kann hier keine Kommentare löschen.]
quelle
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 }
quelle
Ähnlich der Antwort von Andrew, aber ich benutze:
Wählen Sie GetDate () als CurrentDate
Auf diese Weise kann ich in derselben Aktion feststellen, ob SQL Server und Client Probleme mit Zeitzonenunterschieden haben.
quelle