2

Je réalise une application de restauration/sauvegarde de base de données depuis/vers Microsoft SQL Server. Comment puis-je obtenir l'effet de capturer tous les fichiers .bak dans le dossier source, tandis que les zones de texte des bases de données de destination sert de nouveau nom pour la nouvelle base de données et la restaurer dans sql server? Ma validation est que si les noms dans la boîte de groupe de base de données de destination, il va demander une erreur au lieu de le restaurer.Restauration de plusieurs bases de données par programme

Ceci est l'interface 1

ici sont mes codes

CheckDBExist

public List<string> CheckIfDatabaseExists(string SQLServer, string backupRestore) 
{ 
    bool result = false; 
    List<string> DBList = new List<string>(); 
    string sqlConnectionString = this.rbWindow.Checked ? 
       "Server=" + this.cboSQLServer.Text.Trim() + ";Database=master;Trusted_Connection=Yes" : 
       "Server=" + this.cboSQLServer.Text.Trim() + ";Database=master;uid=" + this.txtUsername.Text.Trim() + ";pwd=" + this.txtPassword.Text.Trim(); 
    foreach (Control c in groupBox1.Controls) 
    { 
     if (c.GetType() == typeof(TextBox)) 
     { 
      SqlConnection tmpConn = new SqlConnection(sqlConnectionString); 

      string sqlCreateDBQuery = string.Format("SELECT database_id FROM sys.databases WHERE Name = '{0}'", c.Text); 

      using (tmpConn) 
      { 
       using (SqlCommand sqlCmd = new SqlCommand(sqlCreateDBQuery, tmpConn)) 
       { 
        tmpConn.Open(); 

        object resultObj = sqlCmd.ExecuteScalar(); 

        int databaseID = 0; 

        if (resultObj != null) 
        { 
         int.TryParse(resultObj.ToString(), out databaseID); 
        } 

        tmpConn.Close(); 

        result = (databaseID > 0); 
        if ((!result) && (backupRestore == "backup")) 
        { 
         DBList.Add("[" + c.Text + "]"); 
        } 
        else if ((result) && (backupRestore == "restore")) 
        { 
         DBList.Add("[" + c.Text + "]"); 
        } 

       } 
      } 
     } 
    } 
    return DBList; 
} 

CLICK

private void btnRestore_Click(object sender, EventArgs e) 
{ 
    string outputFolder = this.txtFolder.Text; 
    if (string.IsNullOrEmpty(outputFolder)) 
    { 
     MessageBox.Show("Please select source folder!", "Empty Source Folder", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
    else 
    { 
     List<string> ExistDB = new List<string>(); 
     ExistDB = this.CheckIfDatabaseExists(this.cboSQLServer.Text, "restore"); 
     if (ExistDB.Count == 0) 
     { 
      RestoreDatabase(this.cboSQLServer.Text, this.txtFolder.Text); 
     } 
     else 
     { 
      MessageBox.Show("Databases " + string.Join(", ", ExistDB) + " exist!", "Database Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 
} 

Restaurer le code DB

RestoreDatabase public void (string SQLServer, string outputFolder) {

 ServerConnection con = new ServerConnection(SQLServer); 
     Server server = new Server(con);    

      foreach (Control c in groupBox3.Controls) 
      { 

       //try 
       //{ 
        if (c.GetType() == typeof(TextBox)) 
        { 
         Restore destination = new Restore(); 
         destination.Action = RestoreActionType.Database; 
         destination.Database = c.Text; 
         string backUpFile = outputFolder + "\\" + destination.Database + ".bak"; 
         BackupDeviceItem source = new BackupDeviceItem(backUpFile, DeviceType.File); 

         string logFile = Path.GetDirectoryName(backUpFile); 
         logFile = Path.Combine(logFile, destination.Database + "_Log.ldf"); 

         string dataFile = Path.GetDirectoryName(backUpFile); 
         dataFile = Path.Combine(dataFile, destination.Database + ".mdf"); 


         destination.Devices.Add(source); 
         DataTable logicalRestoreFiles = destination.ReadFileList(server); 
         destination.RelocateFiles.Add(new RelocateFile(logicalRestoreFiles.Rows[0][0].ToString(), dataFile)); 
         destination.RelocateFiles.Add(new RelocateFile(logicalRestoreFiles.Rows[1][0].ToString(), logFile)); 
         destination.ReplaceDatabase = true; 
         destination.SqlRestore(server); 
        }    
       //} 
       //catch (Exception ex) 
       //{ 
       //MessageBox.Show(ex.Message); 
       //}                
      }  
      }     

Ceci est le code qui déclenche l'exception 2

L'erreur dit:

« Impossible de sauvegarde ouverte périphérique 'D: \ TestBackup \ VSM642SP2QC__VfsWorkflow.bak'. ?> Erreur du système d'exploitation 2 (Le système ne peut pas trouver le fichier> spécifié.). \ R \ Nrestore FILELIST se termine anormalement. »

Que dois-je faire?

+0

En cas de défaillance; sur la première base de données ou après? – Anil

+0

C'est étrange. Je n'ai jamais utilisé ces classes. Mais qu'en est-il de l'utilisation d'une commande Sql Server, au lieu de cela? Il suffit d'exécuter la commande "restore [nom de la base de données] à partir du disque = [emplacement du fichier de sauvegarde] –

+0

Vous déclarez un type de périphérique (source), mais vous ne l'accrochez jamais à votre objet Restore. un DeviceType avant d'appeler cette méthode. Sinon, une exception sera levée. " –

Répondre

2

Ajouter cette ligne de code, immédiatement avant la ligne où vous utilisez ReadFileList

destination.Devices.Add(source); 

l'instance doit déclarer restaurer un DeviceType avant d'appeler la méthode ReadFileList. Dans le cas contraire, une exception sera levée. vous avez été un DeviceType déclarez, mais jamais accroché jusqu'à votre Restore.

+0

Je vais essayer ça demain.J'ai laissé mon ordinateur portable de travail dans le bureau.Je vous remercie pour le conseil :) – Jesse

+0

merci @Richard Hansell.Cela fonctionne maintenant! – Jesse

+0

Salut @Richard Hansell. Avez-vous un autre problème, pouvez-vous s'il vous plaît revoir et questionner à nouveau et me donner une suggestion? – Jesse