пятница, ноября 30, 2012

SQL фокус

Несколько часов сражался с проблемой - не коннектится программка, работающая с SQL Server 2008 (10.50.4000), к моему локальному SQL Server 2012 (11.0.3000): рассказывает про “error: 26 - Error Locating Server/Instance Specified”. Google советует покопаться в настройках сети, SQL Server, а также проверить, существует ли что-то на свете вообще...

Все другие программы (Sharepoint'ы из виртуалок, например) нормально работают, а эта локальная программка - никак не желает (соединение в ней организовано через использование ConnectionString).
Стали уже закрадываться мысли, не поставить ли 2008-й сервер...

До установки решил порыться в кодах программы (она не моя и, в принципе, работает – чего же чужие коды изучать…) и обнаружилось, что строка соединения передаётся в класс, наследующий System.Data.Linq.DataContext, в конструкторе которого и наблюдается падение с “ошибкой 26”. Мда… Thumbs down

К счастью, у класса оказался другой конструктор, принимающий заранее открытое соединение, которое и было создано нехитрым кодом:
var connection = new SqlConnection(CONNECTION_String);
connection.Open();

Подсунул эту connection классу вместо CONNECTION_String - программка заработала.
Фокус-покус, едрёныть... Secret telling smile

Кстати, похожую историю можно наблюдать при соединении с SQL Server 2012 по “строке соединения” в SQL-манагере:

image

При  вводе тех же данных (имя/пароль) в поля формы “Вход” сервер открывается нормально. Steaming mad

Technorati Tags:

4 комментария:

Konstantin M. Dyakov комментирует...

Глубоко где-то глюк закопан, вот полное сообщение со стеком вызовов:

Unhandled Exception: System.Data.SqlClient.SqlException: 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)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler,
Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert,
Boolean integratedS17:52ty, SqlConnection owningObject)
at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword,
Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject)
at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword,
Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart)
at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject,
SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance)
at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity,
SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject,
Boolean redirectedUserInstance)
at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options,
Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection,
DbConnectionPool pool, DbConnectionOptions options)
at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection,
DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)

Alexey Varlamov комментирует...

Есть большое подозрение, что проблема в имени машины, содержащее минус. В качестве решения можно попробовать соединиться по IP-адресу, либо назначить ALIAS для SQL-сервера.

Konstantin M. Dyakov комментирует...

Если из-за имени, то это ещё смешнее прикол.
А по ИП, по-моему, пробовал.

Konstantin M. Dyakov комментирует...

И вообще похоже, что прикол в 2012-м сервере: пока с этим упражнялся, перестал работать Шарепойнт (и 2010-й, и 2013-й), база которого на этом же сервере.
Пришлось отключить логин через юзера и оставить только Windows, хотя на SQL Server 2008 r2 нормально работает с включённым комбинированным режимом аутентификации.