Удаление базы данных из C # - PullRequest
13 голосов
/ 02 марта 2011

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

Мысли?

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

РЕДАКТИРОВАТЬ (от Software 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();
});

Ответы [ 7 ]

16 голосов
/ 02 марта 2011

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

Они позволяют вам управлять всеми аспектами 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();
});
9 голосов
/ 02 марта 2011

Попробуйте с этим:

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

Думаю, это поможет.

5 голосов
/ 26 ноября 2013

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

System.Data.Entity.Database.Delete(connectionString);
5 голосов
/ 27 сентября 2013

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 .

5 голосов
/ 10 апреля 2013

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

var server = new Server(SqlServerName);
server.KillDatabase(DatabaseName);
3 голосов
/ 11 марта 2014

I.Создайте файл ресурсов (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()
    {
    }
}
0 голосов
/ 05 сентября 2018

или попробуйте

       var  sqlCommandText = "DROP DATABASE [dbName]";
       var sqlConnection = new SqlConnection(connectionstring);
       var sqlCommand = new SqlCommand(sqlCommandText, sqlConnection);
       sqlConnection.OpenAsync();
       sqlCommand.ExecuteNonQuery();
...