2009-04-02 30 views
1

Im essayant de restaurer la base de données de sauvegarde dynamique avec le code d'applicationRestaurer le feu sql ne marche pas

simple commande SQL pour restaurer

con.execute("RESTORE FILELISTONLY FROM DISK='c:\old.bak' " & vbcrlf &_ 
     "RESTORE DATABASE newdb " & vbcrlf &_ 
     "FROM DISK='c:\old.bak' " & vbcrlf &_ 
     "WITH MOVE 'newdb' TO 'c:\newdb.mdf', " & vbcrlf &_ 
     "MOVE 'newdb_log' TO 'c:\newdb_log.ldf'") 

mais il ne se déclenche pas, je veux dire pas des erreurs essayé de vérifier avec sql profileur et regarder correctement

RESTORE FILELISTONLY FROM DISK='c:\old.bak' 
RESTORE DATABASE newdb 
FROM DISK='c:\old.bak' 
WITH MOVE 'newdb' TO 'c:\newdb.mdf', 
MOVE 'newdb_log' TO 'c:\newdb_log.ldf' 

si je cours sql de ses œuvres profileur SQL

comment pouvez-vous expliquer ce problème?

Répondre

0

Essayez de tuer tous les utilisateurs de la base de données à laquelle vous effectuez la restauration avant d'exécuter la restauration, une restauration échouera s'il existe des connexions actives à la base de données. Assurez-vous également que votre chaîne de connexion utilisée lorsque vous appelez la restauration à partir de votre application ne se connecte pas à la base de données de votre restauration, mais qu'elle se connecte à quelque chose comme master ou msdb.

0

Pour effectuer une restauration, vous êtes bloqué si la base de données est utilisée avec d'autres sessions. Assurez-vous d'attendre 60 secondes et de voir s'il y a des erreurs de dépassement de délai.

+0

puis-je faire «attendre le temps» avec le serveur sql, quelque chose comme le sommeil, existe-t-il dans le serveur sql? – Sasha

+0

Je ne sais pas comment dormir dans T-SQL, mais vous pouvez définir la propriété IDbCommand.CommandTimeout dans les objets .NET. Il s'agit généralement de 30 secondes, tandis que les délais d'attente de connexion sont définis par défaut sur 60 secondes. –

+0

problème ... son classique – Sasha

1

Je suppose que la connexion que vous utilisez en tant que verrou sur la base de données ne peut pas être restaurée. Lorsque vous l'exécutez directement, vous ne l'avez pas fait.

Que pensez-vous de cela?

con.execute("USE master" & vbcrlf &_ 
     "RESTORE FILELISTONLY FROM DISK='c:\old.bak' " & vbcrlf &_ 
     "RESTORE DATABASE newdb " & vbcrlf &_ 
     "FROM DISK='c:\old.bak' " & vbcrlf &_ 
     "WITH MOVE 'newdb' TO 'c:\newdb.mdf', " & vbcrlf &_ 
     "MOVE 'newdb_log' TO 'c:\newdb_log.ldf'") 

Ou de modifier la base de données dans la chaîne de connexion?