2009-05-20 3 views
0

Как определить локальное соединение (localhost или 127.0.0.1) или это удаленное соединение (другое устройство в локальной области), если у меня есть объект SqlConnection?SqlConnection - удаленное или локальное соединение?

+0

почему ты хочешь сделать это? – Matej

+0

Потому что я хочу создать копию копии db моего приложения .net. Если у меня есть локальное соединение mssql, я могу выбрать локальный путь к файлу («c:/tmp /», «d:/someolder» и т. Д.) И путь к локальной сети («\\ 192.168.0.13 \ backup»). Но если у меня есть дистанционное соединение, я должен выбрать только путь к локальной области. Возможно, у меня был путь? – avishnyakov

+0

См. Также: http://stackoverflow.com/questions/14197103/check-if-a-sql-server-instance-is-on-local-computer – stakx

ответ

0

Самый простой способ, с помощью которого я знаю, - проверить строку соединения непосредственно, чтобы увидеть, содержит ли она слова localhost, 127.0.0.1, (localhost), "." или имя локальной машины. Проверьте, с чего начать, поскольку их может быть локальным именованным экземпляром Sql.

Вы можете использовать библиотеку System.Environment для получения текущего имени машины. Вы также можете использовать библиотеку ConnectionBuilder в .Net для извлечения данных без использования полного синтаксического анализа строк. Подробности об этом можно найти here

+0

Я думаю, что это хорошее решение для меня. Спасибо, Диаго. – avishnyakov

1

Вы можете получить строку соединения из objjct SqlConnection.

string s = connection.ConnectionString; 

и проверьте источник данных или элемент сервера этой строки.

Редактировать: Образец образца.

Я думаю, что эта функция должна работать (не проверено в любом случае).

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: обязательно добавьте инструкцию using в пространство имен System.Net.

+0

Ну, это может быть "127.0.0.1", "localhost" , «HOME» или «WORK» и т. Д., И все они являются псевдонимами на локальной машине :( – avishnyakov

0

Вы можете проверить SqlConnection.ConnectionString свойства, чтобы увидеть, если у него есть что-то вроде (local) или . в его server части, но это не очень надежно из %systemroot%\system32\drivers\etc\hosts' and various other SQL Aliases, whereby Foo-srv` вполне может быть локальным окном.

2

Задать SQL, используя соединение с утверждением

SELECT @@SERVERNAME 

затем verifiy, если это совпадает с именем клиентской машины с Environment.MachineName, по модулю имя экземпляра SQL

+1

А как насчет псевдонима сервера mssql? - http: // msdn .microsoft.com/en-us/library/ms188635.aspx Работает ли ваш путь, если я использую псевдоним? – avishnyakov

+0

Должен работать: @@ servername устанавливается во время установки и является именем машины/кластера. Будьте в курсе что он представляет кластер, вы можете получить доступ только к кластерным дискам (например, c $ недоступен) –

+0

Я проверяю его, и он работает хорошо. Действительно хорошее решение! – avishnyakov

Смежные вопросы