2017-02-20 3 views
1

J'essaie de sauvegarder une base de données SQL localDB en utilisant SMO mais sans succès. Quel est le problème avec mon code?Comment faire pour sauvegarder SQL localDB avec SMO

progressBar.Value = 0; 
SaveFileDialog sfd = new SaveFileDialog(); 
string stringCon = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\whdb.mdf;Integrated Security=True"; 
sfd.Filter = "Database backup files (*.bak)|*.bak"; 
sfd.Title = "Create Database Backup"; 
sfd.FileName = DateTime.Today.ToString("ddMMMyyyy") + ".bak"; 
if (sfd.ShowDialog() == DialogResult.OK) 
{ 
    using (SqlConnection conn = new SqlConnection(stringCon)) 
    { 
     ServerConnection servConn = new ServerConnection(conn); 
     SqlConnection.ClearAllPools(); 
     conn.Open(); 
     servConn.Connect(); 
     try { 
      Server serverdb = new Server(servConn); 
      Backup backupdb = new Backup() { Action = BackupActionType.Database, Database="whdb"}; 
      backupdb.Devices.AddDevice(sfd.FileName, DeviceType.File); 
      backupdb.Initialize = true; 
      backupdb.Incremental = false; 
      backupdb.SqlBackupAsync(serverdb); 
      progressBar.Value = 100; 
      conn.Close(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
    } 
} 

Ce l'exception que je reçois quand je le lance:

Une exception non gérée du type 'System.InvalidOperationException' a eu lieu dans System.Data.dll Informations complémentaires: ExecuteNonQuery nécessite un ouvert et disponible Connexion. L'état actuel de la connexion est fermé.

+1

SqlBackup (par exemple pas d'Async) est toujours disponible - havent regardé - si c'est le cas, il se peut que vous fermiez la connexion immédiatement après avoir aligné la commande – BugFinder

+1

Pourquoi appelez-vous 'SqlConnection.ClearAllPools();' et quelle ligne jette cette exception? (se débarrasser du try/catch pour faciliter le débogage) – rene

+0

@BugFinder Merci. J'ai utilisé SqlBackup et fermé le conn après le try et ça a marché. – user7586828

Répondre

0

Je pense que le problème est que vous utilisez

backupdb.SqlBackupAsync(serverdb); 

qui démarre la sauvegarde en cours d'exécution en arrière-plan. Mais, au moment où la sauvegarde se met à courir, vous avez fermé votre connexion.

Vous pouvez soit utiliser

backupdb.SqlBackup(serverdb); 

ou bien retirer votre utilisation et proche et trouver certains était de fermer manuellement la connexion après la sauvegarde.

+0

Correct et aussi parce que j'ai utilisé le nom de la base de données et non le chemin complet + nom de fichier. J'ai remplacé "whdb" par la chaîne myDatabase = Application.StartupPath + "\\ whdb.mdf"; – user7586828