2017-08-21 8 views
2

J'ai créé une classe pour sauvegarder une base de données, le code est:Sauvegarde de base de données avec SMO

public bool BackupDatabase(string databasename) 
     { 
      bool success = false; 

      try 
      { 
       Backup dbBackup = new Backup(); 

       string SqlInstance = @"SERVER\INSTANCE"; 
       string User = ExtractPureUsername(System.Security.Principal.WindowsIdentity.GetCurrent().Name); 
       string BackupLocation = @"\\SERVER\FOLDER\BACKUPTEST_" + User.ToString() + ".bak"; 

       Server srv = new Server(SqlInstance); 

       dbBackup.Action = BackupActionType.Database; 
       dbBackup.Database = databasename; 
       dbBackup.Devices.AddDevice(BackupLocation, DeviceType.File); 
       dbBackup.BackupSetName = "Test database backup"; 
       dbBackup.ExpirationDate = DateTime.Today.AddDays(10); 
       dbBackup.Initialize = false; 
       dbBackup.PercentComplete += CompletionStatusInPercent; 
       dbBackup.Complete += Backup_Completed; 

       dbBackup.SqlBackup(srv); 

       success = true; 
      } 
      catch(Exception ex) 
      { 
       Console.WriteLine(ex); 
       Console.ReadKey(); 
      } 

      return success; 
     } 

Cette traverse, et je reçois l'erreur:

Cannot open backup device - Operating System error 5

Si je devais Exécuter la sauvegarde sur l'instance référencée, dans SSMS, je peux sauvegarder à l'emplacement Bakup qui est spécifié. Je suppose donc que l'erreur se produit parce que la sauvegarde est initiée en tant qu'utilisateur qui exécute le programme C#, et le serveur SQL n'en a aucune. Existe-t-il un moyen de spécifier l'utilisateur à exécuter la sauvegarde?

+2

La sauvegarde est toujours effectuée sous l'utilisateur du service SQL Server; il n'est pas possible de changer ou d'usurper l'identité. Si vous avez une commande de travail dans SSMS pour la même instance, alors SMO construit simplement quelque chose de différent de ce que vous attendez. Double vérifier ceci avec une trace de profileur si nécessaire. –

Répondre

1

Vous devez probablement définir le nom de fichier correct comme local path sur la machine SQL Server. Ainsi, par exemple, au lieu de \\ServerName\Whatever, utilisez c:\Whatever. Assurez-vous que le nom de fichier que vous générez ne contient pas de caractères illégaux, tels que \ ou autre.

+0

Merci - Erreur stupide de ma part, merci pour le coup de pouce. Était en utilisant UNC, en le changeant au chemin local trie le problème. – Leonidas199x