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: }