Search code examples
c#sqldatabase-restore

Chose the back up set from the code


I am restoring a SQL database using C# code.When we are restore a backup using SQL server management studio we can chose the back up set.Can we do that using the code. enter image description here

I used the following code

openFileDialog1.ShowDialog();
    string databaseName = "TempDb";
    Restore sqlRestore = new Restore();

    BackupDeviceItem deviceItem = new BackupDeviceItem(openFileDialog1.FileName, DeviceType.File);
    sqlRestore.Devices.Add(deviceItem);
    sqlRestore.Database = databaseName;

    DataConnection dataConnection = new DataConnection();
    ServerConnection connection = new ServerConnection(dataConnection.DataBaseConnection);
    Server sqlServer = new Server(connection);

    Database db = sqlServer.Databases[databaseName];
    sqlRestore.Action = RestoreActionType.Database;
    String dataFileLocation = db.FileGroups[0].Files[0].FileName;
    String logFileLocation = db.LogFiles[0].FileName;
    db = sqlServer.Databases[databaseName];
    sqlServer.ConnectionContext.Disconnect();
    RelocateFile rf = new RelocateFile(databaseName, dataFileLocation);


    sqlRestore.RelocateFiles.Add(new RelocateFile(databaseName, dataFileLocation));
    sqlRestore.RelocateFiles.Add(new RelocateFile(databaseName + "_log", logFileLocation));
    sqlRestore.ReplaceDatabase = true;
    sqlRestore.Complete += new ServerMessageEventHandler(sqlRestore_Complete);
    sqlRestore.PercentCompleteNotification = 10;
    sqlRestore.PercentComplete += new PercentCompleteEventHandler(sqlRestore_PercentComplete);
    sqlRestore.SqlRestore(sqlServer);
    db = sqlServer.Databases[databaseName];
    db.SetOnline();
    sqlServer.Refresh();

Using the above code its only restore the first set.


Solution

  • Taking a look at Use all backup sets to restore database with SMO, it appears that

    The important field is FileNumber on the Restore object. The default value is 1

    You can get a list of Backupsetsusing the Restore.ReadBackupHeader method.

    VB code from the link

    res.Devices.AddDevice("C:\AdventureWorks2012Backup.BAK", DeviceType.File)
    dt = res.ReadBackupHeader(srv)
    
    For Each r As DataRow In dt.Rows
       For Each c As DataColumn In dt.Columns
          Console.WriteLine(c.ToString + " = " + r(c).ToString())
       Next
    Next
    

    So once you know which backupset you want you can set

    sqlRestore.FileNumber = YOUR_CHOSEN_SET;