Я знаю, что эта проблема широко обсуждалась, но после почти двух дней исследований я так и не смог найти работающего решения.
У меня есть SQL Server, на котором размещены четыре экземпляра версий 2012, 2014, 2016 и 2017 годов, из которых 2012 является экземпляром по умолчанию. Все работает нормально, пока я подключаюсь к экземпляру по умолчанию.
Кроме того, к каждому экземпляру можно подключиться с помощью Management Studio или генератора строки подключения .udl. Но я не могу подключиться к базе данных ни в одном из именованных экземпляров с помощью веб-службы, где пул приложений работает под ApplicationPoolIdentity.
Я несколько раз проверял, что браузер SQL Server работает, что брандмауэр открыт для каждого sqlservr.exe
, а также портов 1433 и 1434. И я думаю, что в противном случае подключение Management Studio было бы невозможным.
Еще стоит отметить, что я могу получить доступ к каждому экземпляру, если я запустил внутренний IIS Express для Visual Studio, чтобы он работал под моей личной учетной записью Windows. В этой учетной записи хранятся учетные данные для компьютера с SQL Server. Зная это, я попытался добавить имя входа SQL Server для своей машины, но SQL Server не принимает имена пользователей типа .\mymachine$
или \\.\mymachine$
, и у меня нет AD для выбора.
Это поведение воспроизводимо на других серверах, а также из простых консольных приложений, которые пытаются подключиться только к базе данных именованного экземпляра.
Сообщение об ошибке гласит:
Ошибка 1326 "Произошла ошибка, связанная с сетью или экземпляром
при установлении соединения с SQL Server. Сервера не было
найден или недоступен Убедитесь, что имя экземпляра правильное
и что SQL Server настроен для разрешения удаленных подключений.
(поставщик: поставщик именованных каналов, ошибка: 40 - не удалось открыть
подключение к SQL Server) ".
Внутреннее исключение является чем-то вроде «Неправильное имя пользователя или пароль» (на немецком языке).
Редактировать
Чтобы прояснить ситуацию, я хочу привести простой пример, показывающий таинственное поведение:
using System;
using System.Data.SqlClient;
namespace ConsoleConnect
{
class Program
{
static void Main(string[] args)
{
try
{
using (SqlConnection con = new SqlConnection(@"User ID=user;Password=pwd;Persist Security Info=False;Connect Timeout=5;Initial Catalog=master;Data Source=mySqlServer"))
{
con.Open();
Console.WriteLine("Default instance opened");
con.Close();
}
using (SqlConnection con = new SqlConnection(@"User ID=user;Password=pwd;Persist Security Info=False;Connect Timeout=5;Initial Catalog=master;Data Source=mySqlServer\namedinstance"))
{
con.Open();
Console.WriteLine("Named instance opened");
con.Close();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.ReadKey();
}
}
}
В то время как мои учетные данные хранятся для OS Access mySqlServer, это выдает:
Default instance opened
Named instance opened
Когда я удаляю сохраненные учетные данные, он выводит
Default instance opened
System.Data.SqlClient.SqlException (0x80131904): Netzwerkbezogener oder instanzspezifischer Fehler beim Herstellen einer Verbindung mit SQL Server. Der Server wurde nicht gefunden, oder auf ihn kann nicht zugegriffen werden. Überprüfen Sie, ob der Instanzname richtig ist und ob SQL Server Remoteverbindungen zulässt. (provider: TCP Provider, error: 0 - Der Wartevorgang wurde abgebrochen.) ---> System.ComponentModel.Win32Exception (0x80004005): Der Wartevorgang wurde abgebrochen
bei System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, DbConnectionPool pool, String accessToken, Boolean applyTransientFaultHandling, SqlAuthenticationProviderManager sqlAuthProviderManager)
bei System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
bei System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions)
bei System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
bei System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
bei System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
bei System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
bei System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
bei System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
bei System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
bei System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
bei System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
bei System.Data.SqlClient.SqlConnection.Open()
bei ConsoleConnect.Program.Main(String[] args) in F:\Tobias\Dokumente\tmp\Projects\ConsoleConnect\ConsoleConnect\Program.cs:Zeile 24.
ClientConnectionId:00000000-0000-0000-0000-000000000000
Fehlernummer (Error Number):258,Status (State):0,Klasse (Class):20
Заранее спасибо,
Tobias