using System.Data; using System.Data.SqlClient; namespace AdvertisingProfitControlData { public class Restore { public string ErrorMessage = string.Empty; public bool SingleFileRestore(string databaseFilePath, string connectionString) { var sqlConStrBuilder = new SqlConnectionStringBuilder(connectionString); try { using (var conn = new SqlConnection(connectionString)) { // var db = new AdvertisingProfitControlDbContext(); //Drop the database to make sure it can be recreated and restored (necessary since the database MUST be on line for its file to be wiped from disk). //if (db.Database.Connection.State == ConnectionState.Open) //{ // db.Database.Connection.Close(); //} var query = @"BEGIN TRY DECLARE @DefaultDataPath varchar(max) DECLARE @DefaultLogPath varchar(max) SELECT @DefaultDataPath = CONVERT(varchar(max),SERVERPROPERTY('INSTANCEDEFAULTDATAPATH')) SELECT @DefaultLogPath = CONVERT(varchar(max),SERVERPROPERTY('INSTANCEDEFAULTLOGPATH')) SELECT @DefaultDataPath = CONCAT(@DefaultDataPath, N'" + sqlConStrBuilder.InitialCatalog + @".mdf') SELECT @DefaultLogPath = CONCAT(@DefaultLogPath, N'" + sqlConStrBuilder.InitialCatalog + @".ldf') IF db_id(N'" + sqlConStrBuilder.InitialCatalog + @"') IS NOT NULL BEGIN ALTER DATABASE " + sqlConStrBuilder.InitialCatalog + @" SET SINGLE_USER WITH ROLLBACK IMMEDIATE DROP DATABASE " + sqlConStrBuilder.InitialCatalog + @" CREATE DATABASE " + sqlConStrBuilder.InitialCatalog + @" END RESTORE DATABASE " + sqlConStrBuilder.InitialCatalog + @" FROM DISK ='" + databaseFilePath + @"' WITH CHECKSUM, REPLACE, MOVE '" + sqlConStrBuilder.InitialCatalog + @"' TO @DefaultDataPath, MOVE '" + sqlConStrBuilder.InitialCatalog + @"_log' TO @DefaultLogPath END TRY BEGIN CATCH ALTER DATABASE " + sqlConStrBuilder.InitialCatalog + @" SET MULTI_USER DECLARE @Error varchar(max) SELECT @Error = ERROR_MESSAGE() RAISERROR(@Error, 11, 1) END CATCH"; //TODO: Verify that the database is good with DBCC command. conn.Open(); var restoreCmd = new SqlCommand(query, conn); restoreCmd.ExecuteNonQuery(); conn.Close(); return true; } } catch (SqlException e) { ErrorMessage = e.Message; return false; } } } }