using System.Data.SqlClient;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
public class IJustWantAFunctionMyGod
public void RestoreExternalSystem()
var databaseToBackup = "The database to back up";
var databaseToRestoreTo = "The name of the database to restore";
var databaseBackupPath = "The path of where to back the aforementioned database up";
if (!databaseBackupPath.EndsWith(Path.DirectorySeparatorChar.ToString())
|| !databaseBackupPath.EndsWith(Path.AltDirectorySeparatorChar.ToString()))
databaseBackupPath += Path.DirectorySeparatorChar.ToString();
databaseBackupPath += $"{databaseToBackup}.bak";
var sqlConnection = new SqlConnection("Some connection string");
var serverConnection = new ServerConnection(sqlConnection);
var server = new Server(serverConnection);
Action = BackupActionType.Database,
Database = databaseToBackup
var backupDeviceItem = new BackupDeviceItem(databaseBackupPath, DeviceType.File);
backup.Devices.Add(backupDeviceItem);
backup.SqlBackup(server);
var restore = new Restore
Action = RestoreActionType.Database,
Database = databaseToRestoreTo
restore.Devices.Add(backupDeviceItem);
restore.ReplaceDatabase = true;
foreach (DataRow row in restore.ReadFileList(server).Rows)
var relocateFile = new RelocateFile
LogicalFileName = row["LogicalName"].ToString()
var physicalName = row["PhysicalName"].ToString();
var path = Path.GetDirectoryName(physicalName);
var fileName = Path.GetFileName(physicalName);
if (string.IsNullOrWhiteSpace(path))
throw new DirectoryNotFoundException(path);
physicalName = Path.Combine(path, $"{databaseToRestoreTo}_{fileName}");
relocateFile.PhysicalFileName = physicalName;
restore.RelocateFiles.Add(relocateFile);
restore.SqlRestore(server);
serverConnection.Disconnect();