Nouvelles Chroniques d'Amethyste

Penser au Sens, pas au Verbe

La librairie SMO

Poster un commentaire

Dans un récent projet j’ai eu besoin de restaurer et supprimer des bases de données SQL Server via un code C#.

Comment faire? La solution est l’utilisation de la librairie SMO (SQL Server Management Objects) que j’ai découvert pour l’occasion. Cette librairie fournit tout ce dont on a besoin pour ce genre d’opérations et bien d’autres.

Comme j’ai un peu galéré pour trouver des exemples qui fonctionnent, voici un petit article rapide sur le sujet.

Création d’un projet SMO

Tout ce que vous avez besoin est d’installer le package:

Microsoft.SQLServer.SMO

 

Restaurer une base

On a tout d’abord besoin de construire une instance de Server à partir de la chaîne de connexion vers la base:


private Server GetServer(string cxnString)
{
   SqlConnection sqlConnextion = new SqlConnection(cxnString);
   ServerConnection cnx = new ServerConnection(sqlConnextion);
   Server serveur = new Server(cnx);
   return serveur;
}

 

Puis la méthode de restauration:

void Restore(string oldDatabaseName, string dbName, string backupPath, string cnxString)
{
   // Connect to the specified instance
   Server server = GetServer(cnxString);
   if (server == null)
   {
      return false;
   }
 
   try
   {
      context.DBName = dbName;
 
      server.ConnectionContext.Connect();
      // Get the default file and log locations
      // If DefaultFile and DefaultLog are empty, use the MasterDBPath and MasterDBLogPath values
      string fileloc = server.Settings.DefaultFile;
      string logloc = server.Settings.DefaultLog;
 
      if (fileloc.Length == 0)
      {
         fileloc = server.Information.MasterDBPath;
      }
      if (logloc.Length == 0)
      {
         logloc = server.Information.MasterDBLogPath;
 
      }
 
      // Use the backup file name to create the backup device
      BackupDeviceItem bdi = new BackupDeviceItem(backupPath, DeviceType.File);
 
      // Create the new restore object, set the database name and add the backup device
      Restore restore = new Restore();
      restore.Database = dbName;
      restore.Devices.Add(bdi);
      restore.ReplaceDatabase = true;
 
      DataTable dataTable = restore.ReadFileList(server);
      foreach (DataRow row in dataTable.Rows)
      {
         var rsfile = new RelocateFile();
         rsfile.LogicalFileName = row.ItemArray[0].ToString();
         string type = row.ItemArray[2].ToString();
         string physicalPath = row.ItemArray[1].ToString();
         string physicalFile = Path.GetFileName(physicalPath);
 
         if (type == "D")
         {
            rsfile.PhysicalFileName = Path.Combine(fileloc,physicalFile);
         }
         else
         {
            rsfile.PhysicalFileName = Path.Combine(logloc, physicalFile);
         }
         restore.RelocateFiles.Add(rsfile);
      }
 
      // Restore the database
      server.KillAllProcesses(oldDatabaseName);
      restore.SqlRestore(server);
   }
   finally
   {
      server.ConnectionContext.Disconnect();
   }
}

 

On a besoin du nom de la base d’origine (oldDatabaseName) et du nouveau nom (dbName). Je n’ai pas réussi à me débarrasser de la contrainte de connaître le nom de la base d’origine, par exemple en l’obtenant en éditant le fichier .bak.

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s