Feedback

C# - Backup und Restore einer SQL-Server-Datenbank über SMO

Veröffentlicht von am 10/18/2006
(3 Bewertungen)
SMO ermöglicht u.A. den Backup und Restore einer SQL-Server-Datenbank. Die Klasse SqlServerBackup setzt diese Technik ein. Beim Restore ist zu beachten, dass eine eventuell vorhandene Verbindung zu der Datenbank nach dem Restore ungültig wird und somit neu erstellt werden muss (am besten vor dem Restore schließen und nach dem Restore neu erzeugen und öffnen).
// **********************************************
// Dies ist eines der 322 Rezepte aus dem
// C# 2005 Premium Codebook. 
// Das Snippet wurde vom Autor mit freundlicher 
// Genehmigung von Addison Wesley 
// bei dotnet-snippets.de veröffentlicht.
// **********************************************

using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;

public class SqlServerBackup
{
   /// <summary>
   /// Wird beim Fortschritt des Backup oder Restore aufgerufen
   /// </summary>
   public event PercentCompleteEventHandler
      PercentComplete;

   /// <summary>
   /// Erzeugt ein Backup einer Datenbank 
   /// </summary>
   /// <param name="serverName">Der Name des SQL Servers</param>
   /// <param name="databaseName">Der Name der zu sichernden Datenbank</param>
   /// <param name="backupFileName">Der Name der Datei, in die das Backup geschrieben werden soll</param>
   /// <param name="useTrustedConnection">Gibt an, ob eine vertraute Verbindung verwendet werden soll</param>
   /// <param name="login">Login-Name für den Login falls keine vertraute Verbindung verwendet werden soll</param>
   /// <param name="password">Passwort für den Login falls keine vertraute Verbindung verwendet werden soll</param>
   public void CreateBackupToFile(string serverName, string databaseName,
      string backupFileName, bool useTrustedConnection, string login,
      string password)
   {
      // Verbindungsinformationen definieren
      ServerConnection serverConnection = new ServerConnection();
      serverConnection.ServerInstance = serverName;
      if (useTrustedConnection)
      {
         serverConnection.LoginSecure = true;
      }
      else
      {
         serverConnection.LoginSecure = false;
         serverConnection.Login = login;
         serverConnection.Password = password;
      }

      // Verbindung aufbauen
      Server server = new Server(serverConnection);
      try
      {
         server.ConnectionContext.Connect();

         // Backup in die angegebene Datei erstellen
         Backup backup = new Backup();
         backup.Action = BackupActionType.Files;
         backup.Database = databaseName;
         if (this.PercentComplete != null)
         {
            backup.PercentComplete += this.PercentComplete;
         }
         backup.Devices.Add(new BackupDeviceItem(
            backupFileName, DeviceType.File));
         backup.SqlBackup(server);
      }
      finally
      {
         try
         {
            // Verbindung zum SQL-Server abbauen
            server.ConnectionContext.Disconnect();
         }
         catch { }
      }
   }

   /// <summary>
   /// Restauriert ein Backup einer Datenbank 
   /// </summary>
   /// <param name="serverName">Der Name des SQL Servers</param>
   /// <param name="databaseName">Der Name der wiederherzustellenden Datenbank</param>
   /// <param name="backupFileName">Der Name der Datei, die das Backup enthält</param>
   /// <param name="useTrustedConnection">Gibt an, ob eine vertraute Verbindung verwendet werden soll</param>
   /// <param name="login">Login-Name für den Login falls keine vertraute Verbindung verwendet werden soll</param>
   /// <param name="password">Passwort für den Login falls keine vertraute Verbindung verwendet werden soll</param>
   public void RestoreFromFile(string serverName, string databaseName,
   string backupFileName, bool useTrustedConnection, string login,
   string password)
   {
      // Verbindungsinformationen definieren
      ServerConnection serverConnection = new ServerConnection();
      serverConnection.ServerInstance = serverName;
      if (useTrustedConnection)
      {
         serverConnection.LoginSecure = true;
      }
      else
      {
         serverConnection.LoginSecure = false;
         serverConnection.Login = login;
         serverConnection.Password = password;
      }

      // Verbindung aufbauen
      Server server = new Server(serverConnection);
      try
      {
         server.ConnectionContext.Connect();

         // Restore aus der angegebenen Datei
         Restore restore = new Restore();
         restore.Action = RestoreActionType.Database;
         restore.Database = databaseName;
         if (this.PercentComplete != null)
         {
            restore.PercentComplete += this.PercentComplete;
         }
         restore.Devices.Add(new BackupDeviceItem(
            backupFileName, DeviceType.File));
         restore.SqlRestore(server);
      }
      finally
      {
         try
         {

            // Verbindung zum SQL-Server abbauen
            server.ConnectionContext.Disconnect();
         }
         catch { }
      }
   }
}

Abgelegt unter SMO, SQL Server, Backup, Restore, Datenbank.

1 Kommentare zum Snippet

Gøran Homberg schrieb am 9/2/2009:
Ich hatte beim Backupeinspielen ein wenig Probleme.

der Aufruf von
server.KillAllProcesses(databaseName);

nach dem Erstellen der neuen "Server"-Instanz hat geholfen :)
 

Logge dich ein, um hier zu kommentieren!