有人知道如何使用C#备份SQL Server 2005/2008数据库并获取备份进度吗?
这是一个纯粹的 ADO.NET 解决方案,如果在目标计算机上安装 SMO/SQLDMO 时遇到困难(如果可以避免最好不要),则可以使用此方法。
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("'", "''") + "'";
}
stats = 1
子句告诉SQL Server在指定的百分比间隔(在这种情况下为1%)发出严重程度为0的消息。 FireInfoMessageEventOnUserErrors
属性和InfoMessage
事件确保C#代码在执行期间捕获这些消息,而不仅仅是在结束时。
"restore database {0} from disk = {1} with replace, stats = 1"
。至于百分比值,个人只需在消息上使用正则表达式,例如Regex.Match(e.Message, "(\d{1,3}) percent")
。 - Christian Hayter