从C#删除数据库

我有一个MDF文件,我在使用MSTEST测试期间附加到我的本地SQL服务器,我不想在运行测试集50次后手动删除这些临时数据库。 (我已经这样做了,我不喜欢它。<)我正在寻找一种方法,在我完成测试后,在我的TestCleanup方法中从服务器中删除数据库。 我只需要一些关于我将用来执行此操作的SQL语句的指导。

思考?

Thx提前! :d

编辑 (由软件猴子,从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(); }); 

看一下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(); }); 

试试这个:

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

我认为这会有所帮助。

我建议使用Microsoft.SqlServer.Management.Smo.Server.KillDatabase方法,而不是使用Database类型删除TestCleanup中的数据库。 此外,这将在删除数据库之前关闭所有现有SQL连接。 因此,您的unit testing(或者更确切地说是集成测试)可能会使连接保持打开状态,这对清理方法没有影响。

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

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.ConnectionInfoMicrosoft.SqlServer.Management.Sdk.SfcMicrosoft.SqlServer.Management.Smo

以下是使用Entity Framework第6版的方法

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

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。 在unit testing中使用数据库帮助器

 [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() { } } 

或试试这个

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