从C#删除数据库

时间:2011-03-02 16:28:47

标签: c# sql-server mstest

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

思想?

提前thx! :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();
});

7 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:8)

试试这个:

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

我认为这会有所帮助。

答案 2 :(得分:5)

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

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

答案 3 :(得分: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 < / em>和 Microsoft.SqlServer.Management.Smo

答案 4 :(得分:5)

以下是使用Entity Framework第6版

的方法
System.Data.Entity.Database.Delete(connectionString);

答案 5 :(得分:3)

我。创建资源文件(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()
    {
    }
}

答案 6 :(得分:0)

或尝试

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