Wie kann ich feststellen, ist es lokale Verbindung (localhost oder 127.0.0.1) oder ist es Remote-Verbindung (andere Maschine im lokalen Bereich), wenn ich SqlConnection-Objekt habe?SqlConnection - ist Remote oder lokale Verbindung?
Antwort
Der einfachste Weg, den ich kenne, ist, den Connectionstring direkt zu überprüfen, um zu sehen, ob er die Worte localhost, 127.0.0.1, (localhost), "." oder der Name des lokalen Computers. Überprüfen Sie, ob Sie mit einer lokalen benannten Instanz von Sql starten möchten.
Sie können die System.Environment-Bibliothek verwenden, um den aktuellen Computernamen abzurufen. Sie können auch die ConnectionBuilder-Bibliothek in .Net verwenden, um die Daten ohne vollständiges String-Parsing abzurufen. Einzelheiten hierzu sind here
Ich denke, es ist eine gute Lösung für mich. Vielen Dank, Diago. – avishnyakov
Sie können die Verbindungszeichenfolge aus dem SqlConnection-Objekt herausholen.
string s = connection.ConnectionString;
und überprüfen Sie die Datenquelle oder das Serverelement dieser Zeichenfolge.
Bearbeiten: Codebeispiel bereitgestellt.
Ich denke, dass diese Funktion funktionieren sollte (noch nicht getestet).
private bool CheckConnectionStringLocalOrRemote(string connectionString) {
//Local machine
IPHostEntry entry = Dns.GetHostByAddress("127.0.0.1");
IPAddress[] addresses = entry.AddressList;
String[] aliases = entry.Aliases;
string hostName = entry.HostName;
if(connectionString.Contains(hostName))
return true;
foreach (IPAddress address in addresses) {
if (connectionString.Contains(address.ToString())) {
return true;
}
}
foreach (string alias in aliases) {
if (connectionString.Contains(alias))
return true;
}
return false;
}
Ps: Stellen Sie sicher, eine using-Anweisung zum System.Net-Namespace hinzuzufügen.
Nun, es kann "127.0.0.1", "localhost" sein , "HOME" oder "WORK" etc und alle von ihnen sind Aliase der lokalen Maschine :( – avishnyakov
Sie überprüfen können SqlConnection.ConnectionString
Eigenschaft, um zu sehen, ob es so etwas wie (local)
oder .
in seinem server
Teil hat, aber das ist nicht sehr zuverlässig, da die %systemroot%\system32\drivers\etc\hosts' and various other SQL Aliases, whereby
foo-srv` kann auch eine lokale Feld sein.
Stellen Sie SQL mit der Verbindung mit der Aussage
SELECT @@SERVERNAME
dann verifiy wenn dieses Spiel der Name des Client-Rechners mit Environment.MachineName, Modulo der SQL-Instanzname
findenUnd was ist mit mssql Server alias? - http: // msdn .microsoft.com/de-us/library/ms188635.aspx Funktioniert Ihr Weg, wenn ich Alias verwende? – avishnyakov
Sollte funktionieren: @@ Servername ist auf Setup-Zeit eingestellt und ist der Name der Maschine/Cluster. Seien Sie sich bewusst dass es sich um einen Cluster handelt, kann man nur auf Clusterdisketten zugreifen (zB c $ ist nicht verfügbar) –
Ich überprüfe es und es funktioniert gut. Wirklich gute Lösung! – avishnyakov
Warum willst du das machen? – Matej
Weil ich db Kopieformular meine .net Anwendung erstellen möchte. Wenn ich lokale mssql Verbindung habe, kann ich den lokalen Dateipfad ("c:/tmp /", "d:/someolder" usw.) und lokalen Bereichspfad ("\\ 192.168.0.13 \ backup") wählen. Aber wenn ich Fernverbindung habe, muss ich nur lokalen Bereich wählen. Vielleicht ist mein Pfad falsch? – avishnyakov
Siehe auch: http://stackoverflow.com/questions/14197103/check-if-a-sql-server-instance-is-on-local-computer – stakx