2017-06-23 10 views
1

Quelques informations pour commencer:Comment puis-je restaurer un fichier .bak sur un nouveau serveur sans utiliser les fichiers .mdf ou .ldf, par programmation avec C#?

  1. J'utilise SQL Server Express 2014
  2. J'utilise C#
  3. Je ne peux pas utiliser les fonctions SMO pour accomplir la tâche suivante

I Je tente de restaurer un fichier .bak que j'ai obtenu de l'ordinateur A, sur l'ordinateur B. Je veux faire cela par programmation en utilisant C#, mais ne pas utiliser les fonctions SMO.

Dans SSMS (SQL Server Management Studio), je peux restaurer manuellement une base de données avec rien de plus qu'un fichier .bak. J'aimerais pouvoir faire la même chose en exécutant un programme avec C#.

Je suis capable de restaurer un fichier .bak aussi longtemps que j'ai les fichiers .mdf et .ldf, mais pas sans eux. Le faire manuellement dans SSMS semble fonctionner, donc je suppose qu'il doit y avoir un moyen de le faire avec C# aussi. Voici ce que j'ai:

DBConnection connect1 = new DBConnection(); 
connect1.connectionString = "Data Source=" + textBox1.Text + "; Integrated Security=SSPI"; // textbox1 contains a user entered server name. 

// Create a new database. 
using (SqlConnection myConnection = new SqlConnection(connect1.connectionString))// set the connection to sql. 
{ 
    SqlCommand createDB = new SqlCommand("Create Database [" + dbName + "]", myConnection); 
    createDB.Connection.Open(); 
    createDB.ExecuteNonQuery(); 
} 

// Restore the data from the backup into the new database. 
connect1 = new DBConnection(); 
connect1.connectionString = "Data Source=" + textBox1.Text + "; Initial Catalog=Master; Integrated Security=SSPI"; 
using (SqlConnection myConnection = new SqlConnection(connect1.connectionString))// set the connection to sql. 
{ 
    //SqlCommand createDB = new SqlCommand("Restore Database [" + dbName + "] FROM DISK = " + bakDirctory + " " 
    // + "WITH MOVE '" + oldDBName + "' TO '" + mdfDirectory + "', " 
    // + "MOVE '" + oldDBName + "_log' TO '" + ldfDirectory + "', " 
    // + "REPLACE", myConnection); 
    // oldDBName contains what the name of the database was when the .bak file was created. 

    SqlCommand createDB = new SqlCommand("Restore Database [" + dbName + "] FROM DISK = " + bakDirectory, myConnection); 
    createDB.Connection.Open(); 
    createDB.ExecuteNonQuery(); 
} 

La partie commentée des œuvres d'extrait de code, mais nécessite l'utilisation des fichiers .mdf et .ldf. La partie juste au-dessous utilise uniquement le fichier .bak mais je reçois une exception non gérée lorsque vous tentez d'exécuter ce code:

Le jeu de sauvegarde contient une sauvegarde d'une base de données autre que la base de données existante « dbname »

Je crois que c'est parce que la structure de base de données de la base de données nouvellement créée ne correspond pas à la structure de la base de données dans le fichier .bak. (Corrigez-moi si je me trompe). Est-il possible pour moi de restaurer la sauvegarde en utilisant uniquement le fichier .bak? Merci d'avance de prendre le temps de regarder cela.

+1

Pas besoin de créer la base de données au préalable. Utilisez simplement 'RESTORE' avec les options' MOVE' et 'REPLACE'. Voir https://docs.microsoft.com/en-us/sql/t-sql/statements/restore-statements-transact-sql –

+6

Vous savez si vous allez restaurer un fichier .bak dans SSMS et en haut cliquez sur "[Script] (https://i.stack.imgur.com/EfggG.png)" il vous donnera le script qui fera n'importe quelle action que vous avez mis en place dans l'interface graphique. Vous pouvez simplement copier et coller la requête dans votre programme. –

+0

@DanGuzman J'ai essayé de regarder cette page mais je n'ai pas trouvé de solution. Seriez-vous capable de fournir un extrait de code à titre d'exemple? – Sudsy1002

Répondre

1

Comme l'a déclaré @DanGuzman, il n'était pas nécessaire de créer une nouvelle base de données auparavant. Suivant les instructions de @ScottChamberlain dans les commentaires, j'ai pu trouver le script nécessaire pour restaurer la base de données sans utiliser les fichiers .mdf ou .ldf. Le script exact était:

SqlCommand createDB = new SqlCommand("RESTORE DATABASE [" + dbName + "] FROM DISK = N'" + bakDirectory + "' " + 
"WITH FILE = 2, MOVE N'" + oldDBName + "' TO N'C:\\Program Files\\Microsoft SQL Server\\MSSQL12.ANTSQLSERVER\\MSSQL\\DATA\\" + dbName + ".mdf', " + 
"MOVE N'" + oldDBName + "_log' TO N'C:\\Program Files\\Microsoft SQL Server\\MSSQL12.ANTSQLSERVER\\MSSQL\\DATA\\" + dbName + "_log.ldf', NOUNLOAD, STATS = 5", myConnection); 

Le (C: \ Program Files \ Microsoft SQL Server \ MSSQL12.ANTSQLSERVER \ MSSQL \ DATA \) chemin était l'emplacement par défaut où .mdf et .ldf sont créés.