63 lines
3.2 KiB
C#
63 lines
3.2 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
}
|