Files
advertising-profit-control/AdvertisingProfitControlData/Restore.cs
T

57 lines
2.9 KiB
C#

using System.Data.SqlClient;
namespace AdvertisingProfitControlData
{
public class Restore
{
public string ErrorMessage = string.Empty;
public bool SingleFileRestore(string databaseFilePath, string defaultServerName)
{
var sqlConStrBuilder = new SqlConnectionStringBuilder(AdvertisingProfitControlDbContext.ConnectionString);
var masterConnection = @"data source=" + defaultServerName + @";integrated security=True;MultipleActiveResultSets=True;App=EntityFramework";
try
{
using (var conn = new SqlConnection(masterConnection))
{
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).
db.Database.Delete();
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
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
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;
}
}
}
}