Skip to content

Instantly share code, notes, and snippets.

@DavidRogersDev
Last active August 29, 2015 14:01
Show Gist options
  • Save DavidRogersDev/bb3f8e1b419b66f131ab to your computer and use it in GitHub Desktop.
Save DavidRogersDev/bb3f8e1b419b66f131ab to your computer and use it in GitHub Desktop.
A class for use in integration testing which creates and drops a database for every applicable test.
internal class DatabaseSetup
{
internal static string connStr = ConfigurationManager.ConnectionStrings["NameOfConnString"].ConnectionString;
private const string MasterSchema = "Master";
internal void InstallDatabase(string resourceName)
{
InstallDatabase(connStr, GetScript(resourceName));
}
private static string GetScript(string resourceName)
{
// scripts are embedded as resources. Makes it infallible to find scripts in tests.
switch (resourceName)
{
case Constants.CreateDbDefault:
return Resources.CreateDb;
default:
throw new NotSupportedException(string.Format("There's no resource script called {0}", resourceName));
}
}
internal void InstallDatabase(string connectionString, string scriptToRunIn)
{
var builder = new SqlConnectionStringBuilder(connectionString) {InitialCatalog = MasterSchema};
using (var conn = new SqlConnection(builder.ConnectionString))
{
conn.Open();
using (var cmd = new SqlCommand())
{
cmd.Connection = conn;
foreach (var sqlBlock in scriptToRunIn.Split(new[] { "GO" }, StringSplitOptions.RemoveEmptyEntries))
{
cmd.CommandText = sqlBlock;
cmd.ExecuteNonQuery();
}
}
}
}
internal void UninstallDatabase()
{
this.UninstallDatabase(connStr);
}
internal void UninstallDatabase(string connectionString)
{
var builder = new SqlConnectionStringBuilder(connectionString);
builder.InitialCatalog = MasterSchema;
using (var conn = new SqlConnection(builder.ConnectionString))
{
conn.Open();
const string dropCmd = @"
IF EXISTS (SELECT name
FROM master.dbo.sysdatabases
WHERE name = N'DBName')
DROP DATABASE [DBName];";
using (var cmd = new SqlCommand(dropCmd, conn))
cmd.ExecuteNonQuery();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment