2017-02-20 2 views
1

Ich versuche, eine SQL-Datenbank lokal zu speichern, mithilfe von SMO aber ohne Erfolg. Was ist falsch an meinem Code? DieseSo sichern Sie SQL localDB mit 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()); 
     } 
    } 
} 

die Ausnahme, die ich bekomme, wenn ich es laufen:

Eine nicht behandelte Ausnahme des Typs ‚System.InvalidOperationException‘ aufgetreten in System.Data.dll Zusätzliche Informationen: ExecuteNonQuery erfordert eine offene und verfügbar Verbindung. Der aktuelle Status der Verbindung ist geschlossen.

+1

Ist SqlBackup (z. B. kein Async) noch verfügbar - nicht gesucht - wenn ja, könnte es sein, weil Sie die Verbindung unmittelbar nach dem Auskleiden des Befehls schließen – BugFinder

+1

Warum rufen Sie 'SqlConnection.ClearAllPools();' und welche Zeile wirft diese Ausnahme? (Entfernen Sie den Versuch/Fang, um das Debuggen zu vereinfachen) – rene

+0

@BugFinder Danke. Ich benutzte SqlBackup und schloss das Conn nach dem Versuch zu fangen und es funktionierte. – user7586828

Antwort

0

ich glaube, das Problem ist, dass Sie

backupdb.SqlBackupAsync(serverdb); 

verwenden, die die Sicherung im Hintergrund zu laufen beginnt. Wenn die Sicherung jedoch ausgeführt wird, haben Sie die Verbindung geschlossen.

Sie könnte entweder

backupdb.SqlBackup(serverdb); 

verwenden oder auch entfernen Sie Ihre Verwendung und in der Nähe und finden Sie einige war die Verbindung nach der Sicherung manuell zu schließen.

+0

Korrekt und auch weil ich den Datenbanknamen und nicht den vollständigen Pfad + Dateiname verwendet. Ich ersetzte "whdb" durch die Zeichenfolge myDatabase = Application.StartupPath + "\\ whdb.mdf"; – user7586828