1: using System;
   2: using System.Data.SqlClient;
   3: using System.IO;
   4:  
   5: namespace PebbleSteps.TestingTools
   6: {   7:public class TemporarySqlExpressDatabase : IDisposable
   8:     {   9:private const string SqlExpressConnectionString
  10:             = "Data Source=.\\sqlexpress;Initial Catalog=tempdb;Integrated Security=true;User Instance=True;";
  11:  
  12:private readonly string _temporaryDatabaseFileName;
  13:private readonly TemporaryDirectory _temporaryDirectory;
  14:private bool _disposed;
  15:  
  16:public TemporarySqlExpressDatabase()
  17:         {  18:             _temporaryDirectory = new TemporaryDirectory();
  19:             DatabaseName = "temp" + Guid.NewGuid().ToString("N");  20:             _temporaryDatabaseFileName = Path.Combine(_temporaryDirectory.FullName, DatabaseName + ".mdf");
  21:  
  22: using (var connection = new SqlConnection(SqlExpressConnectionString))
  23:             {  24:                 connection.Open();
  25:  
  26: using (SqlCommand command = connection.CreateCommand())
  27:                 {  28:                     command.CommandText =
  29: string.Format("CREATE DATABASE {0} ON PRIMARY (NAME={0}, FILENAME='{1}', SIZE = 3000KB) LOG ON ( NAME = N'{0}_Log', FILENAME = N'{1}_Log.ldf', SIZE = 512KB)", DatabaseName, _temporaryDatabaseFileName);  30:                     command.ExecuteNonQuery();
  31:  
  32:                     command.CommandText = "EXEC sp_detach_db '" + DatabaseName + "', 'true'";
  33:                     command.ExecuteNonQuery();
  34:                 }
  35:             }
  36:         }
  37:  
  38:public string ConnectionString
  39:         {  40:             get
  41:             {  42: return
  43: string.Format(@"Server=.\SQLExpress;AttachDbFilename={0};Database={1}; Trusted_Connection=Yes;",  44:                                   _temporaryDatabaseFileName, DatabaseName);
  45:             }
  46:         }
  47:  
  48:public string DatabaseName { get; private set; }  49:  
  50:#region IDisposable Members
  51:  
  52:public void Dispose()
  53:         {  54:             Dispose(true);
  55:             GC.SuppressFinalize(this);
  56:         }
  57:  
  58:#endregion
  59:  
  60:private static void ClearConnectionsToTemporaryDatabase()
  61:         {  62:             GC.Collect();
  63:             SqlConnection.ClearAllPools();
  64:         }
  65:  
  66:private void Dispose(bool disposing)
  67:         {  68: if (!_disposed)
  69:             {  70: // Cleanup Managed resources
  71:                 ClearConnectionsToTemporaryDatabase();
  72:                 _temporaryDirectory.Dispose();
  73:  
  74: if(disposing)
  75:                 {  76: //Clean unmanaged resources
  77:                 }
  78:  
  79:                 _disposed = true;
  80:             }
  81:         }
  82:  
  83:         ~TemporarySqlExpressDatabase()
  84:         {  85:             Dispose(false);
  86:         }
  87:     }
  88: }