Удаление базы данных из С#

У меня есть файл MDF, который я прикрепляю к локальному SQL-серверу во время тестирования с помощью MSTEST, и я не хочу, чтобы удалять эти временные базы данных вручную после того, как я запустил тестовый набор 50 раз. (Я уже сделал это, и мне это не нравится. <) Я ищу способ удалить базу данных с сервера после завершения тестов во время моего метода TestCleanup. Мне просто нужно небольшое руководство по тому, какие SQL-операторы я буду использовать для этого.

Мысли?

спасибо заранее!: D

РЕДАКТИРОВАТЬ (по программному обеспечению Monkey, из OP отклонено редактирование для ответа ODED)

Вот код, который работал у меня:

var server = new Server(serverName); // Can use overload that specifies 

foreach (Database db in server.Databases)
{
     if (db.Name.ToLower().Contains(testDatabaseIdentifier))
     {
          databasesToDelete.Add(db.Name);
     }
}
databasesToDelete.ForEach(x =>
{
     Database db = new Database(server, x);
     db.Refresh();
     db.Drop();
});

Ответ 1

Взгляните на SMO (объекты управления SQL Server).

Они позволяют управлять всеми аспектами SQL Server с кода, включая удаление баз данных.

Объект базы данных имеет метод Drop.

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

var server = new Server(serverName); // Can use overload that specifies 

foreach (Database db in server.Databases)
{
     if (db.Name.ToLower().Contains(testDatabaseIdentifier))
     {
          databasesToDelete.Add(db.Name);
     }
}
databasesToDelete.ForEach(x =>
{
     Database db = new Database(server, x);
     db.Refresh();
     db.Drop();
});

Ответ 2

Попробуйте следующее:

sqlCommandText = "DROP DATABASE [NAME]";
sqlCommand = new SqlCommand(sqlCommandText , connection);
sqlCommand.ExecuteNonQuery();

Я думаю, что это поможет.

Ответ 3

Вот как вы это делаете, используя Entity Framework версии 6

System.Data.Entity.Database.Delete(connectionString);

Ответ 4

Вместо использования типа Database для удаления базы данных в TestCleanup я бы рекомендовал использовать метод Microsoft.SqlServer.Management.Smo.Server.KillDatabase. Кроме того, это приведет к закрытию всех существующих SQL-соединений до удаления базы данных. Таким образом, ваши модульные тесты (или, скорее, интеграционные тесты) могут открыть соединения, и это не повлияет на метод очистки.

var server = new Server(SqlServerName);
server.KillDatabase(DatabaseName);

Ответ 5

Ответ feO2x отлично работает, но он не дал кода. Следующее работает, если у вас есть строка подключения к базе данных в app.config.

using System.Configuration;
using System.Data.SqlClient;
using Microsoft.SqlServer.Management.Common;
public class Foo
{
    public static void DropDatabase(string connectionName)
    {
        using (
            var sqlConnection =
                new SqlConnection(
                    ConfigurationManager.ConnectionStrings[connectionName]
                    .ConnectionString))
        {
            var serverConnection = new ServerConnection(sqlConnection);
            var server = new Microsoft.SqlServer.Management.Smo.Server(
                             serverConnection);
            server.KillDatabase(sqlConnection.Database);
        }
    }
}

Вы должны ссылаться на System.Data, * System.Configuratio * n, Microsoft.SqlServer.ConnectionInfo, Microsoft.SqlServer.Management.Sdk.Sfc и Microsoft.SqlServer.Management.Smo.

Ответ 6

. Создайте файл ресурсов (Resources.rsx) и напишите sql-запросы:

  • SQL_KillConnections

DECLARE @DatabaseName nvarchar(50)
SET @DatabaseName = N'{0}'
DECLARE @SQL varchar(max)
SELECT @SQL = COALESCE(@SQL,'') + 'Kill ' + Convert(varchar, SPId) + ';'
FROM MASTER..SysProcesses
WHERE DBId = DB_ID(@DatabaseName) AND SPId <> @@SPId
EXEC(@SQL)
  • SQL_DropDatabaseIfExists

IF EXISTS(select * from sys.databases where name='{0}')
DROP DATABASE [{0}]

II. Добавить класс MsSqlDatabaseTestsHelper в тестовый проект

public class MsSqlDatabaseTestsHelper
{
    private readonly string _connectionString;

    public MsSqlDatabaseTestsHelper(string connectionString)
    {
        _connectionString = connectionString;
    }

    private void ExecuteNonQuery(string sql)
    {
        using (var connection = new SqlConnection(_connectionString))
        {
            connection.Open();
            SqlCommand command = connection.CreateCommand();
            command.CommandText = sql;
            command.ExecuteNonQuery();
        }
    }

    public void CreateDatabase(string databaseName)
    {
        ExecuteNonQuery("CREATE DATABASE {0}".Set(databaseName));
    }

    public void DropDatabase(string databaseName)
    {
        try
        {
            ExecuteNonQuery(Resources.SQL_KillConnections
                .Set(databaseName));
        }
        catch (Exception)
        {
            throw new Exception("Can't kill database '{0}' connections"
                .Set(databaseName));
        }

        try
        {
            ExecuteNonQuery(Resources.SQL_DropDatabaseIfExists
                .Set(databaseName));
        }
        catch (Exception)
        {
            throw new Exception("Can't drop database '{0}'"
                .Set(databaseName));
        }
    }
}

III. Использовать помощник базы данных в своих модульных тестах

[TestFixture]
public class CmsPageRepositoryTests
{
    private readonly MsSqlDatabaseTestsHelper _msSqlDatabaseTestsHelper = 
        new MsSqlDatabaseTestsHelper(ConnectionStringWithoutDatabase);

    private const string ConnectionStringWithoutDatabase = 
        @"server=.\SqlExpress;uid=sa;pwd=1;";

    private const string DatabaseName = "TestPersistence";

    [SetUp]
    public void SetUp()
    {
        _msSqlDatabaseTestsHelper.DropDatabase(DatabaseName);
        _msSqlDatabaseTestsHelper.CreateDatabase(DatabaseName);
    }

    [TearDown]
    public void TearDown()
    {
        _msSqlDatabaseTestsHelper.DropDatabase(DatabaseName);
    }

    [Test]
    public void TestSomethingWithDatabaseUsing()
    {
    }
}