2017-02-17 2 views
2

J'essaie de créer des fonctionnalités de sauvegarde et de restauration à mon application de formulaire Windows. J'ai donc essayé de faire une restauration de base de données. Mon code est comme ceci:Comment faire pour restaurer SQL localDB par programme

string cbdfilename = "c:\\Users\\Public\\Public Document"; 
SqlConnection.ClearAllPools(); 
SqlConnection con = new SqlConnection("Data Source=(LocalDB)\\v11.0;AttachDbFilename=|DataDirectory|\\BbCon.mdf;Integrated Security=True;Connect Timeout=30;"); 
string sql; 

sql = "Use master;Alter Database BbCon Set Single_User With Rollback Immediate;Restore Database BbCon From Disk = @FILENAME With Replace;Alter Database BbCon Set Multi_User;"; 

SqlCommand cmd = new SqlCommand(sql, con); 
cmd.Parameters.AddWithValue("@FILENAME", cbdfilename); 

con.Open(); 

try 
{ 
    cmd.ExecuteNonQuery(); 
} 
catch(Exception ex) 
{ 
    MessageBox.Show("Restore DB failed" + ex.ToString()); 
} 
finally 
{ 
    con.Close(); 
    con.Dispose(); 
} 

Mais lorsque je tente de lancer cela, je reçois une erreur:

Restore db failed System.Data.SqlClient.SqlException(0X80131904):userdoesnot have permission to alter database BbCon.mdf the database doesnot exist or or datbase is not in a state that allows access checks.

Quelqu'un peut-il me aider s'il vous plaît?

+0

Il s'agit d'une base de données locale, il suffit de se déconnecter et de copier le fichier avec les commandes System.IO comme FileStream. Ensuite, pour le restaurer il suffit d'écraser le MDB avec une copie de la sauvegarde. Je ne crois pas que les fichiers db mdb locaux ont des tables système/maîtres, etc. ou que les commandes de sauvegarde/restauration fonctionneront dessus. –

+0

@Ryan Mann, localDB est MDF et dispose également d'une commande de sauvegarde/restauration standard. Mais une partie est correcte, quand nous avons juste besoin d'une copie de MDF, (pas de sauvegarde), nous avons besoin d'arrêter le serveur et juste copier .. –

+0

Et 'ALTER DATABASE' nécessite de se connecter à la base de données principale en tant qu'administrateur = Vrai) Ensuite, le message d'exception avec les autorisations sera résolu. –

Répondre

4

Essayez-vous de sauvegarder ou de restaurer? Vous mentionnez Sauvegarde dans le titre et la commande est pour la restauration.

Il n'y a pas encore beaucoup de cas d'exemple pour localDB.

Utilisez mon code comme ci-dessous. Espérons que cela aide ..

Pour De support

string master_ConnectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;Database=Master;Integrated Security=True;Connect Timeout=30;"; 

using (SqlConnection masterdbConn = new SqlConnection()) 
{ 
    masterdbConn.ConnectionString = master_ConnectionString; 
    masterdbConn.Open(); 

    using (SqlCommand multiuser_rollback_dbcomm = new SqlCommand()) 
    { 
     multiuser_rollback_dbcomm.Connection = masterdbConn; 
     multiuser_rollback_dbcomm.CommandText= @"ALTER DATABASE yourdbname SET MULTI_USER WITH ROLLBACK IMMEDIATE"; 

     multiuser_rollback_dbcomm.ExecuteNonQuery(); 
    } 
    masterdbConn.Close(); 
} 

SqlConnection.ClearAllPools(); 

using (SqlConnection backupConn = new SqlConnection()) 
{ 
    backupConn.ConnectionString = yourConnectionString; 
    backupConn.Open(); 

    using (SqlCommand backupcomm = new SqlCommand()) 
    { 
     backupcomm.Connection = backupConn; 
     backupcomm.CommandText= @"BACKUP DATABASE yourdbname TO DISK='c:\yourdbname.bak'"; 
     backupcomm.ExecuteNonQuery(); 
    } 
    backupConn.Close(); 
} 

Pour de la restauration:

string master_ConnectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;Database=Master;Integrated Security=True;Connect Timeout=30;"; 

using (SqlConnection restoreConn = new SqlConnection()) 
{ 
    restoreConn.ConnectionString = master_ConnectionString; 
    restoreConn.Open(); 

    using (SqlCommand restoredb_executioncomm = new SqlCommand()) 
    { 
     restoredb_executioncomm.Connection = restoreConn; 
     restoredb_executioncomm.CommandText = @"RESTORE DATABASE yourdbname FROM DISK='c:\yourdbname.bak'"; 

     restoredb_executioncomm.ExecuteNonQuery(); 
    } 
    restoreConn.Close(); 
} 

Update-

Oops, désolé, mon code est pour SQL localdb 2014 mais il vous semble utilisez 2012. Veuillez remplacer (LocalDB) \ MSSQLLocalDB par (LocalDB) \ v11.0

Et bien vouloir juste essayer avec le changement ci-dessus.

Et pour votre information, selon mon expérience, si j'ai écrit | Data Directory | Dans ma connectionString, je ne pouvais lire (commande SQL SELECT) que la base de données. En d'autres termes, les commandes Insérer et Mettre à jour peuvent être effectuées, mais la base de données n'a pas été insérée ou mise à jour réellement sans aucune exception. Je pense que la configuration en tant que | Data Directory | rendrait la base de données en lecture seule et j'ai trouvé que certaines personnes avaient des difficultés à insérer ou mettre à jour à la base de données avec | réglage.

J'espère que vos bons jours! Merci !

+0

merci pour le code mais quand j'ai essayé le code ci-dessus je reçois une erreur error-50 erreur d'exécution de base de données fournie nom de l'instance de base de données invalide pouvez-vous m'aider –

+0

pouvez-vous m'aider –

+0

Bien sûr, si les gens ont vraiment besoin d'aide ... être conseillé comme ma réponse mise à jour. Merci ! –