Не удается подключиться к базе данных Microsoft SQL Server после ее создания («Система не может найти указанный файл») - PullRequest
2 голосов
/ 08 ноября 2019

У меня есть сценарий, который подготавливает среду для тестового запуска, который требует подключения к базе данных (создает несколько таблиц, записывает несколько значений и т. Д.)

У меня есть сценарий PowerShell, который создает DB_NAME с помощью

& sqllocaldb create DB_NAME
& sqllocaldb start DB_NAME
& sqllocaldb info DB_NAME

Вывод:

LocalDB instance "DB_NAME" created with version 13.1.4001.0.
LocalDB instance "DB_NAME" started.

Name:               DB_NAME
Version:            13.1.4001.0

Shared name:        

Owner:              fv-az604\VssAdministrator
Auto-create:        No
State:              Running

Last start time:    11/7/2019 11:47:43 PM

Instance pipe name: np:\\.\pipe\LOCALDB#24C8D765\tsql\query

Соединение выполняется через следующий код

using (SqlCommand cmd = new SqlCommand(sql))
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        cmd.Connection = connection;
        cmd.Connection.Open();
        cmd.ExecuteNonQuery();
    }
}

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

Application Name=MyApp;Connect Timeout=60;Data Source=localhost;Initial Catalog=master;Integrated Security=sspi;Connection Reset=false;Min Pool Size=1;Max Pool Size=200;Pooling=true;MultipleActiveResultSets=true;Enlist=false

Имя базы данных: DB_NAME

Полная трассировка стека:

[Error]: 
Type: System.ComponentModel.Win32Exception
Message: The system cannot find the file specified
Source: 
Stack:

Type: System.Data.SqlClient.SqlException
Message: 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: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)
Source: .Net SqlClient Data ProviderHelpLink.ProdName: Microsoft SQL Server
HelpLink.EvtSrc: MSSQLServer
HelpLink.EvtID: 2
HelpLink.BaseHelpUrl: http://go.microsoft.com/fwlink
HelpLink.LinkId: 20476

Stack:
   at 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)
   at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
   at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
   at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.Open()
   at MyClass.MyFuncABC(String connectionString, String databaseName) in D:\a\1\s\App\MyClass.cs:line 333
   at MyClass.MyFuncAB() in D:\a\1\s\App\MyClass.cs:line 444
   at MyClass.MyFuncA() in D:\a\1\s\App\MyClass.cs:line 555
   at App.Main(String[] args) in D:\a\1\s\App\Main.cs:line 1337

1 Ответ

2 голосов
/ 08 ноября 2019

Первое сообщение об ошибке пропавшего файла - просто грязь в воде. Настоящим является второй, который хорошо известен примерно каждому администратору базы данных SQL Server:

Сообщение. При установлении соединения с SQL Server произошла ошибка, связанная с сетью или экземпляром. Сервер не найден или не был доступен. Убедитесь, что имя экземпляра указано правильно и что SQL Server настроен для разрешения удаленных подключений. (поставщик: поставщик именованных каналов, ошибка: 40 - не удалось открыть соединение с SQL Server)

Как говорится в сообщении, невозможно установить соединение с SQL Server. Клиентская библиотека пытается подключиться через TCP / IP, общую память и именованные каналы. Так как канал является последним вариантом, и он тоже не работает, ошибка содержит сообщение от каналов.

LocalDB имеет свой собственный , вполне особый синтаксис , для Строки подключения . Тот, который вы использовали, - для подключения к реальному SQL Server.

Может быть, что-то вроде

Server=np:\\.\pipe\LOCALDB#24C8D765\tsql\query

будет работать лучше. Кроме того, узнайте имя экземпляра вашей локальной базы данных и попробуйте что-то вроде

Server=(localdb)\MyInstance;Integrated Security=true;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...