Updated the backup and restore functions to be more verbose and stable. Changed the version number slightly for appearance reasons. Fixed a bug on the Main Form that prevented it from refreshing the controls properly after all years have been wiped and after a database restore.
This commit is contained in:
@@ -6,28 +6,42 @@ namespace AdvertisingProfitControlData
|
||||
{
|
||||
public string ErrorMessage = string.Empty;
|
||||
|
||||
public bool SingleFileRestore(string databaseFilePath)
|
||||
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(sqlConStrBuilder.ConnectionString))
|
||||
using (var conn = new SqlConnection(masterConnection))
|
||||
{
|
||||
var query = $"RESTORE DATABASE {sqlConStrBuilder.InitialCatalog} FROM DISK='{databaseFilePath}'";
|
||||
|
||||
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 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 useMasterCommand = new SqlCommand("USE master", conn);
|
||||
useMasterCommand.ExecuteNonQuery();
|
||||
|
||||
var alter1Cmd = new SqlCommand($"ALTER DATABASE {sqlConStrBuilder.InitialCatalog} SET Single_User WITH Rollback Immediate", conn);
|
||||
alter1Cmd.ExecuteNonQuery();
|
||||
|
||||
var restoreCmd = new SqlCommand(query, conn);
|
||||
restoreCmd.ExecuteNonQuery();
|
||||
|
||||
var alter2Cmd = new SqlCommand($"ALTER DATABASE {sqlConStrBuilder.InitialCatalog} SET Multi_User", conn);
|
||||
alter2Cmd.ExecuteNonQuery();
|
||||
conn.Close();
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user