2009-05-20 9 views
0

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?

+0

Warum willst du das machen? – Matej

+0

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

+0

Siehe auch: http://stackoverflow.com/questions/14197103/check-if-a-sql-server-instance-is-on-local-computer – stakx

Antwort

0

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

+0

Ich denke, es ist eine gute Lösung für mich. Vielen Dank, Diago. – avishnyakov

1

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.

+0

Nun, es kann "127.0.0.1", "localhost" sein , "HOME" oder "WORK" etc und alle von ihnen sind Aliase der lokalen Maschine :( – avishnyakov

0

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.

2

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

finden
+1

Und was ist mit mssql Server alias? - http: // msdn .microsoft.com/de-us/library/ms188635.aspx Funktioniert Ihr Weg, wenn ich Alias ​​verwende? – avishnyakov

+0

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) –

+0

Ich überprüfe es und es funktioniert gut. Wirklich gute Lösung! – avishnyakov