Строка подключения к удаленному SQL Server

У меня был проект, в котором SQL Server и разработка работали локально.

Была использована следующая строка подключения:

  SqlConnection connection= new SqlConnection("Data Source=.\\MYDB;Initial Catalog=Database;Integrated Security=true");
  connection.Open();

Моя команда разработчиков сейчас растет, и я хочу, чтобы другой разработчик получил доступ к той же базе данных.

Ему нужно будет изменить эту строку подключения, и мы пытаемся выяснить, что нужно изменить в строке — до сих пор мы пробовали:

  SqlConnection connection= new SqlConnection("Data Source=2.221.1.145\\MYDB;Initial Catalog=Database;Integrated Security=true");
  connection.Open();

Но при посещении страницы выдается следующая ошибка:

[SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)]
   System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +5352431
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +244
   System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean withFailover) +5363103
   System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover) +145
   System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout) +922
   System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance) +307
   System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData) +518
   System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) +278
   System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) +38

В SQL Server включен протокол TCPIP, и он прослушивает все IP-адреса в моей системе. Порт 1433 добавлен к брандмауэру для входящего трафика UDP и TCP, а служба экземпляра SQL Server Express перезапущена.

Может ли кто-нибудь помочь нам со строкой подключения? Кроме того, я чувствую, что линию интегрированной безопасности необходимо будет изменить.

Чтобы упростить задачу, я переместил вопрос с обновленным статусом в новый поток: Строка подключения для SQL Server Express при ошибке входа на удаленный компьютер


person RenegadeAndy    schedule 02.07.2014    source источник
comment
Если у меня возникают проблемы с подключением, я часто использую IP-адрес, как и вы. Но... пробовали ли вы DNS-имя для сервера?   -  person Dave Mason    schedule 03.07.2014
comment
да - и у меня такая же проблема!   -  person RenegadeAndy    schedule 03.07.2014
comment
Какую версию SQL вы используете? Это локальная версия БД? SELECT @@VERSION легко вам скажет.   -  person Dave Mason    schedule 03.07.2014
comment
Я отредактировал ваш заголовок. См. Должны ли вопросы включать «теги» в свои заголовки?, если нет единого мнения, не следует.   -  person John Saunders    schedule 03.07.2014
comment
Вы пытаетесь заставить их подключиться к экземпляру SQL вашего локального компьютера?   -  person Tacoman667    schedule 03.07.2014
comment
Можно ли подключиться к экземпляру с помощью SQL Management Studio? Попробуйте это, чтобы убедиться, что это не проблема с сетью.   -  person Babak Naffas    schedule 03.07.2014
comment
Это не проблема сети — они подключаются к обычному экспресс-экземпляру SQL Server 2012, а не к локальной базе данных.   -  person RenegadeAndy    schedule 03.07.2014


Ответы (4)


Не на 100% уверен, что это вызывает эту ошибку, но я видел, как люди сбивались с пути при первом удаленном подключении к SQL Server, поэтому стоит проверить:

Откройте свойства сервера в SSMS, в разделе «Подключения» проверьте, установлен ли флажок Allow remote connections to this server. Вам понадобится этот флажок для подключения с другого компьютера, даже если он находится в той же локальной сети.

person PulseLab    schedule 02.07.2014
comment
Это проверено :) - но не устраняет проблему. - person RenegadeAndy; 03.07.2014

Проверьте, не является ли вашей проблемой «Integrated Security = 'true'».

Если это так, это будет означать, что ваше удаленное соединение должно будет предоставить учетные данные доступа/безопасности.

person user2961405    schedule 02.07.2014

MYDBT Попробуйте строку подключения, подобную этой:

SqlConnection connection= new SqlConnection("Server=2.221.1.145;Database=Database;Trusted_Connection=True");

(при необходимости укажите параметры сервера и базы данных)

Кроме того, вы упомянули, что открыли порты, и это хорошо. Есть еще одна часть конфигурации SQL, на которую следует обратить внимание. Зайдите в Диспетчер конфигурации SQL на вашем сервере SQL. Разверните сетевую конфигурацию SQL Server. Откройте Протоколы для {вашего экземпляра} и дважды щелкните TCP/IP. На вкладке IP-адреса прокрутите до самого низа. Убедитесь, что динамические порты TCP пусты. Также убедитесь, что TCP-порт равен 1433, как вы и ожидали.

EDIT1: обновлено соединение в соответствии с предложением комментария.

Кроме того, поскольку вы подключаетесь удаленно, внимательно посмотрите на бит Trusted_Connection. Может ли ваша учетная запись Windows, которую вы используете на своем локальном компьютере, войти в систему и подключиться к SQL на удаленном сервере? Если вы ничего не делаете удаленно и это в той же подсети, вам, вероятно, не нужно об этом беспокоиться.

РЕДАКТИРОВАТЬ2:

Энди - судя по вашему комментарию, ваша проблема заключается в том, что ваше соединение не является доверенным, и вам нужно будет ввести имя пользователя и пароль. Это определяется в SQL, если вы используете логины SQL. Если вы используете аутентификацию Windows, вам необходимо добавить свою учетную запись пользователя домена в разрешенные логины.

Если вы используете входы SQL, вам нужно будет использовать строку подключения в стиле «стандартной безопасности», тогда как, если вы используете учетную запись домена, вам нужно будет использовать строку подключения в стиле «доверенное подключение». См. здесь пример строки:

https://www.connectionstrings.com/sql-server-2012/

Standard Security Server=myServerAddress;Database=myDataBase;ID пользователя=myUsername; Пароль=мойПароль;

Trusted Connection Server=myServerAddress;Database=myDataBase;Trusted_Connection=True;

Теперь вы можете спросить, где настроить этот логин SQL! Вам нужно будет создать как логин SQL, так и пользователя базы данных. Это можно сделать за 1 шаг из SQL Management Studio. Вот подробное руководство из MSDN:

http://msdn.microsoft.com/en-us/library/aa337562.aspx

person Bill Sambrone    schedule 02.07.2014
comment
Я думаю, что OP пытается подключиться к именованному экземпляру — в данном случае MYDB. - person Dave Mason; 03.07.2014
comment
Исходя из того, что представил OP, MYDB — это имя экземпляра SQL Server, а не имя базы данных. Если у него правильный IP-адрес, вероятно, в его строке подключения все в порядке. - person Dave Mason; 03.07.2014
comment
Мы говорим об одном и том же? Я просто указываю, что один параметр строки подключения — Data Source=SqlServerName для экземпляра SQL Server по умолчанию — ИЛИ — Data Source=SqlServerName\InstanceName для именованного экземпляра SQL Server. В моей среде, если вы попытаетесь подключиться к именованному экземпляру, но предоставите только DNS-имя SqlServer (или IP-адрес), вы получите ту же ошибку, с которой сталкивается OP (при установлении связь...) - person Dave Mason; 03.07.2014
comment
С вашей строкой мы получаем ошибку входа в систему .... но я не могу получить правильные переменные UserId и Password .... какими они должны быть? Как добавить этого пользователя в SQL Server? - person RenegadeAndy; 03.07.2014
comment
Он просто говорит: Ошибка входа для пользователя «Энди». - person RenegadeAndy; 03.07.2014
comment
Чтобы упростить задачу, я переместил вопрос с обновленным статусом в новый поток: stackoverflow.com/questions/24541681/ - person RenegadeAndy; 03.07.2014

Наконец-то получилось.

Включение безопасности для проверки подлинности Windows и SQL. Затем следующее: project">Как мне создать пользователя в базе данных SQL Server Express, которую я добавил в свой проект? с последующим GRANT EXECUTE для всех хранимых процедур дал нам именно то, что нам было нужно!

person RenegadeAndy    schedule 02.07.2014