Удаление базы данных из С#
У меня есть файл 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-запросы:
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)
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()
{
}
}