«SqlException (0x80131904): не удается открыть базу данных» при попытке удалить БД - PullRequest
0 голосов
/ 18 октября 2018

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

Правильно ли я предположил, что упомянутая база данных больше не существует в то время, когда она пытается выполнить следующий код?Исключение вызывается command.ExecuteNonQuery();

Интересно, что это исключение возникает только при выполнении тестов на нашем экземпляре TFS, а не локально.Заранее спасибо.

private static void DropDatabase(IDbConnection connection)
{
    var databaseName = GetDatabaseName(connection.ConnectionString);
    var str = $@"USE master;
                 ALTER DATABASE [{databaseName}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
                 DROP DATABASE [{databaseName}];";

    try
    {
        using (DbCommand command = new SqlConnection(connection.ConnectionString).CreateCommand())
        {
            command.CommandText = str;
            command.CommandType = CommandType.Text;
            command.Connection.Open();
            command.ExecuteNonQuery();
            command.Connection.Close();
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }
}

System.Data.SqlClient.SqlException (0x80131904): Cannot open database "MyTestDb_8647C" requested by the login. The login failed.
Login failed for user 'MYDOMAIN\MyServiceUser'.
    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.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
    at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
    at System.Data.SqlClient.SqlConnection.Open()
    at [...].Testing.DatabaseTestBase.DropDatabase(IDbConnection connection) in D:\[...]\DatabaseTestBase.cs:line 37

1 Ответ

0 голосов
/ 18 октября 2018

Либо база данных по умолчанию для вашего имени входа больше не существует, либо строка подключения пытается подключиться к базе данных, которая не существует.В строке подключения установите для свойства Initial Catalog значение master.Затем вы можете удалить оператор USE MASTER.Кроме того, убедитесь, что база данных по умолчанию для вашего имени входа установлена ​​на существующую базу данных.Судя по вашему коду, вы, вероятно, захотите использовать и мастер для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...