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)
using System;
using System.Configuration;
using
System.Data.SqlClient
;
using
System.Data
;
base de données
/// </summary>
classe publique DbOper
{
serveur de chaîne privée ;
uid de chaîne privée
;
base de données de chaîne privée ;
conn de chaîne privée ;
/// <summary>
/// Constructeur de la classe DbOper
/// </summary> résumé>
public DbOper()
{
conn=System.Configuration.ConfigurationSettings.AppSettings["constr"].ToString();
server=cut(conn,"server=",";")
; =",";");
pwd=cut(conn,"pwd=",";");
base de données=cut(conn,"database=",";");
}
chaîne publique cut(chaîne str,chaîne bg ,string ed)
{
string
sub=str.Substring(str.IndexOf(
bg)+bg.Length
sub=sub.Substring(0,sub.IndexOf(
";"));
/// <summary>
/// Sauvegarde de la base de données
/// </summary>
public bool DbBackup(string url)
{
SQLDMO.Backup oBackup = new SQLDMO.BackupClass()
;
essayez
{
oSQLServer.LoginSecure = false;
oSQLServer.Connect(server,uid, pwd);
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 base de données";
oBackup.Initialize = true;
oBackup.SQLBackup(oSQLServer);
return true;
}
catch
{
return false;
throw;
}
enfin
{
oSQLServer.DisConnect();
}
}
/// <summary>
/// Récupération de base de données
/// </summary>
public string DbRestore(string url)
{
if(exepro()!=true)//Exécuter la procédure stockée
{
return "Opération échouée"
}
else
{
;SQLDMO.Restore oRestore = new SQLDMO.RestoreClass();
SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
try
{
oSQLServer.LoginSecure
= false
;
.SQLDMORestore_Database ;
oRestore.Database = base de données ;
oRestore.Files
= url;//@"d:Northwind.bak" ;
oRestore.ReplaceDatabase =
true
;
;
}
catch(Exception e)
{
return "Échec de la restauration de la base de données";
throw
}
enfin
{
oSQLServer.DisConnect();
}
}
}
private bool 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");
try
{
conn1.Open();
cmd.ExecuteNonQuery();
return true;
}
catch(Exception ex)
{
return false;
}
enfin
{
conn1.Close();
}
}
}
}