2010-06-29 7 views

Répondre

25

est ici une solution pure ADO.NET, si vous rencontrez des difficultés pour installer SMO/SQLDMO sur la machine cible (il est une douleur dans le derrière, mieux éviter si vous le pouvez).

public void BackupDatabase(SqlConnection con, string databaseName, string backupName, string backupDescription, string backupFilename) { 
    con.FireInfoMessageEventOnUserErrors = true; 
    con.InfoMessage += OnInfoMessage; 
    con.Open(); 
    using(var cmd = new SqlCommand(string.Format(
     "backup database {0} to disk = {1} with description = {2}, name = {3}, stats = 1", 
     QuoteIdentifier(databaseName), 
     QuoteString(backupFilename), 
     QuoteString(backupDescription), 
     QuoteString(backupName)), con)) { 
     cmd.ExecuteNonQuery(); 
    } 
    con.Close(); 
    con.InfoMessage -= OnInfoMessage; 
    con.FireInfoMessageEventOnUserErrors = false; 
} 

private void OnInfoMessage(object sender, SqlInfoMessageEventArgs e) { 
    foreach(SqlError info in e.Errors) { 
     if(info.Class > 10) { 
      // TODO: treat this as a genuine error 
     } else { 
      // TODO: treat this as a progress message 
     } 
    } 
} 

private string QuoteIdentifier(string name) { 
    return "[" + name.Replace("]", "]]") + "]"; 
} 

private string QuoteString(string text) { 
    return "'" + text.Replace("'", "''") + "'"; 
} 

La clause stats = 1 dit SQL Server pour émettre des messages 0 gravité à l'intervalle de pourcentage spécifié (dans ce cas, 1%). La propriété FireInfoMessageEventOnUserErrors et l'événement InfoMessage garantissent que le code C# capture ces messages pendant l'exécution plutôt que seulement à la fin.

+0

Je cherchais quelque chose comme ça depuis longtemps ... la version de Restore est-elle si différente? Quelle partie du message d'information dit quel est le pourcentage de progrès réel? – Patrick

+2

La commande restore est très similaire, par ex. '" restaurer la base de données {0} à partir du disque = {1} avec replace, stats = 1 "'. En ce qui concerne la valeur en pourcentage, personnellement, j'utilise simplement une regex sur le message, par ex. 'Regex.Match (e.Message," (\ d {1,3}) pour cent ")'. –

1

Voici some code de MSDN utilisant SMO. This link explique comment surveiller la progression.

Questions connexes