我有一个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();
});
答案 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查询:
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()
{
}
}
答案 6 :(得分:0)
或尝试
var sqlCommandText = "DROP DATABASE [dbName]";
var sqlConnection = new SqlConnection(connectionstring);
var sqlCommand = new SqlCommand(sqlCommandText, sqlConnection);
sqlConnection.OpenAsync();
sqlCommand.ExecuteNonQuery();