La dernière fois, j'ai travaillé sur un projet impliquant la restauration et la récupération de bases de données. J'ai effectué une recherche en ligne et j'ai découvert qu'il était implémenté à l'aide de SQLDMO. Il vous suffit d'ajouter une référence SQLDMO, puis d'utiliser les méthodes des classes suivantes pour y parvenir.
J'ai étendu la classe de l'auteur d'origine afin qu'il puisse reconnaître automatiquement la chaîne de connexion à la base de données dans web.config et restaurer les informations récupérées via des paramètres variables.
Vous devez faire attention lors de la restauration. Le plus gros problème est lors de la restauration lorsque d'autres utilisateurs utilisent la base de données, ils ne peuvent pas restaurer. La solution consiste à ajouter une procédure stockée dans la base de données MASTER :
créer proc killspid (@dbname varchar(20))
comme
commencer
déclarer @sql nvarchar(500)
déclarer @spid int
set @sql='déclare le curseur getspid pour
sélectionnez spid dans les processus système où dbid=db_id( '''+@dbname+''')'
exécutable (@sql)
ouvrir getpid
récupérer ensuite de getspid dans @spid
tandis que @@fetch_status<>-1
commencer
exec('kill '+@spid )
récupérer ensuite de getspid dans @spid
fin
fermer getpid
désallouergetpid
fin
ALLER
Pour exécuter cette procédure stockée avant la restauration, vous devez transmettre dbname, qui est le nom de votre base de données. Voici le code original de la classe : (la chaîne de connexion à la base de données dans web.config est constr)
utiliser le système ;
en utilisant System.Configuration ;
en utilisant System.Data.SqlClient ;
en utilisant System.Data ;
espace de noms web.base_class
{
/// <résumé>
/// Classe DbOper, utilise principalement SQLDMO pour réaliser la sauvegarde et la récupération de la base de données Microsoft SQL Server
/// </summary>
classe publique DbOper
{
serveur de chaînes privé ;
UID de chaîne privée ;
mot de passe de chaîne privée ;
base de données de chaînes privée ;
connexion de chaîne privée ;
/// <résumé>
/// Constructeur de la classe DbOper
/// </summary>
public DbOper()
{
conn=System.Configuration.ConfigurationSettings.AppSettings["constr"].ToString();
serveur=cut(conn,"serveur=",";");
uid=cut(conn,"uid=",";");
pwd=cut(conn,"pwd=",";");
base de données=cut(conn,"base de données=",";");
}
chaîne publique coupée (chaîne str, chaîne bg, chaîne ed)
{
sous-chaîne ;
sub=str.Substring(str.IndexOf(bg)+bg.Length);
sub=sub.Substring(0,sub.IndexOf(";"));
retourner le sous ;
}
/// <résumé>
/// Sauvegarde de la base de données
/// </summary>
public bool DbBackup (URL de chaîne)
{
SQLDMO.Backup oBackup = new SQLDMO.BackupClass();
SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
essayer
{
oSQLServer.LoginSecure = faux ;
oSQLServer.Connect(serveur,uid, mot de passe);
oBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database ;
oBackup.Database = base de données ;
oBackup.Files = url;//"d:Northwind.bak";
oBackup.BackupSetName = base de données ;
oBackup.BackupSetDescription = "Sauvegarde de la base de données" ;
oBackup.Initialize = true ;
oBackup.SQLBackup(oSQLServer);
renvoie vrai ;
}
attraper
{
renvoie faux ;
lancer;
}
enfin
{
oSQLServer.DisConnect();
}
}
/// <résumé>
/// Récupération de base de données
/// </summary>
chaîne publique DbRestore (URL de chaîne)
{
if(exepro()!=true)//Exécuter la procédure stockée
{
return "L'opération a échoué" ;
}
autre
{
SQLDMO.Restore oRestore = new SQLDMO.RestoreClass();
SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
essayer
{
oSQLServer.LoginSecure = faux ;
oSQLServer.Connect(serveur, uid, mot de passe) ;
oRestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database ;
oRestore.Database = base de données ;
oRestore.Files = url;//@"d:Northwind.bak";
oRestore.FileNumber = 1 ;
oRestore.ReplaceDatabase = true ;
oRestore.SQLRestore(oSQLServer);
renvoie "ok" ;
}
attraper (Exception e)
{
return "Échec de la restauration de la base de données" ;
lancer;
}
enfin
{
oSQLServer.DisConnect();
}
}
}
booléen privé exepro()
{
SqlConnection conn1 = new SqlConnection("server="+server+";uid="+uid+";pwd="+pwd+";database=master");
SqlCommand cmd = new SqlCommand("killspid",conn1);
cmd.CommandType = CommandType.StoredProcedure ;
cmd.Parameters.Add("@dbname","port");
essayer
{
conn1.Open();
cmd.ExecuteNonQuery();
renvoie vrai ;
}
attraper(Exception ex)
{
renvoie faux ;
}
enfin
{
conn1.Close();
}
}
}
}