2011-03-02 11 views
10

MSTESTでテスト中にローカルSQLサーバーに接続するMDFファイルがあります。テストセットを実行した後で手動でこれらの一時データベースを削除する必要はありません。 50回。 (私はすでにそれをやったことがあります>。<)私はTestCleanupメソッドの中で、私はテストを終えた後、サーバーからデータベースを削除する方法を探しています。私は、これを行うために使用するSQL文について、少しだけ指針が必要です。C#からデータベースを削除する

思考?

Thxで事前に! :Dここ

EDIT(ソフトウェアモンキーことで、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

実際のMDFファイルを削除するという意味ですか?そのためにフレームワークから通常のファイル削除メソッドを使用します。 MDE内のテーブルを削除することを意味するならば、単純な一連の 'DELETE FROM tableName'ステートメントです。 –

+0

似たようなことを調査して、私の自動化されたテストでSQLCEを使ってしまった。これもあなたのための選択肢でしょうか? –

+0

@ロベルト、私が指定すべきであったことを申し訳ありません。 mdf自体ではなく、mdfを添付したときに作成されたdbだけです。 – khr055

答えて

14

SMO(SQLを見てみましょうサーバー管理オブジェクト)。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(); 
}); 
+0

server.Databasesを反復することが私の鍵でした。私はここから残りを動かすことができます。どうも! – khr055

+0

@Mike - これは助けになるとうれしいです:) – Oded

+0

foreachでdbを削除するとコレクションが変更され、例外が発生するため、コードを少し変更しました。また、それをリフレッシュせずにdbを削除するだけでも例外が発生することがわかりました。 – khr055

8

これを試してみてください:

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

私はこれが役立つだろうと思います。

+0

EntityFrameworkコードの場合まず、次のコードを使用します。 '_db.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction、" use master; drop database [mydatabase] "'。 – deerchao

4

Databaseタイプを使用してTestCleanupでデータベースを削除する代わりに、Microsoft.SqlServer.Management.Smo.Server.KillDatabaseメソッドを使用することをお勧めします。さらに、データベースを削除する前に既存のSQL接続をすべて終了します。したがって、単体テスト(または統合テスト)では接続が開いたままになることがあり、クリーンアップメソッドには影響しません。

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

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.Sfc、およびMicrosoft.SqlServer.Managementを参照する必要があります.Smo。ここで

5

を使用すると、Entity Frameworkのバージョン6

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

ありがとうございます。 – Rapunzo

2

I.は、リソースファイル(リソースを作成を使用してそれを行う方法です。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) 
    • SQL_KillConnections SQL_DropDatabaseIfExists

    IF EXISTS(select * from sys.databases where name='{0}') 
    DROP DATABASE [{0}] 
    

    II。テストプロジェクト

    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にMsSqlDatabaseTestsHelperクラスを追加します。あなたのユニットテストでデータベースヘルパーを使用してください

    [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() 
        { 
        } 
    } 
    
関連する問題