随着进度备份SQL Server数据库

RPS*_*RPS 15 .net c# sql-server

有人知道如何用C#备份SQL Server 2005/2008数据库并获得数据库备份进度吗?

Chr*_*ter 29

这是一个纯粹的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("'", "''") + "'";
}
Run Code Online (Sandbox Code Playgroud)

stats = 1子句告诉SQL Server以指定的百分比间隔(在这种情况下为1%)发出严重性为0的消息.的FireInfoMessageEventOnUserErrors属性和InfoMessage事件确保C#代码执行过程中,而不是仅在端捕获这些消息.

  • restore命令非常相似,例如"从磁盘恢复数据库{0} = {1}使用replace,stats = 1".至于百分比值,我个人只是在消息上使用正则表达式,例如`Regex.Match(e.Message,"(\ d {1,3})%")`. (2认同)