2016-09-19 1 views
0

j'ai réussi à écrire une fonction qui me permet de sauvegarder une base de données SQL Server, mais je me bats à essayer de restaurer et d'utiliser la version sauvegardée.RESTORE DATABASE se termine anormalement

Mon code:

Try 
     Dim confirmBackUp As MsgBoxResult 
     confirmBackUp = MsgBox("Are you sure you want to restore?") 

     If confirmBackUp = MsgBoxResult.Yes Then Else Exit Sub 
     Dim cmd As New OleDbCommand 
     con = New OleDbConnection() 

      ' con.Connectionstring is read from an .ini file, but the string is correct 

     con.Open() 
     cmd.CommandType = CommandType.Text 
     cmd.CommandText = "RESTORE DATABASE MaintenanceControl FROM DISK='c:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\Backup\MaintenanceControl.bak'" 
     cmd.Connection = con 
     cmd.ExecuteNonQuery() 

     MsgBox("Database Restored", MsgBoxStyle.OkOnly, "Success") 
     con.Close() 

    Catch ex As Exception 
     errorLog(ex.Message, ex.StackTrace) 
     MsgBox("Could not restore database, refer to error log") 

    End Try 

Mais sur la ligne .ExecuteNonQuery(), je reçois l'erreur suivante;

RESTORE DATABASE se termine de manière anormale.

RESTORE ne peut pas traiter la base de données « MaintenanceControl » parce qu'il est utilisé par cette session. Il est recommandé d'utiliser la base de données master lors de cette opération.

Quel est le problème? Est-ce parce que con est aussi le nom de la connexion à la base de données en direct et ne devrait pas recevoir de nouvelle chaîne?

EDIT

J'ai maintenant mis la Initial Catalog partie de la connexion au « Maître », ainsi que con.Close ajouté() avant con = New OleDbconnection mais l'erreur que je reçois maintenant est

RESTORE DATABASE se termine anormalement. L'accès exclusif n'a pas pu être obtenu car la base de données est en cours d'utilisation.

+0

Est-ce que votre point de chaîne de connexion à la base de données MaintenanceControl aussi? Effectuer une restauration sur une base de données à laquelle vous êtes connecté pourrait être le problème - le message d'erreur semble certainement le suggérer. – phillyd

+1

Avez-vous essayé 'Use master; allez; cmd.CommandText =" RESTORE DATABASE MaintenanceCo ..... '? – artm

+0

@phillyd A l'ouverture du programme,' con' pointe vers la version live de MaintenanceControl, ouais –

Répondre

0

Si vous êtes ok avec supprimant et en recréant la base de données, vous pouvez utiliser cette déclaration, qui vous permettra de le laisser tomber:

alter database MaintenanceControl set single_user with rollback immediate; 
drop database SomeDatMaintenanceControl base; 

puis créer la base de données à partir de zéro que vous avez besoin.

Dropping la base de données va détruire la base de données afin qu'il n'y ait aucune possibilité que quelqu'un y est connecté pendant que vous essayez de restaurer. Ensuite, vous créez la base de données proprement.