Кто-либо знает, как скопировать базу данных SQL Server 2005/2008 с C# и получить прогресс резервного копирования базы данных?
Вот чистое решение 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 выдавать сообщения с уровнем серьезности 0 в указанном процентном интервале (в данном случае 1%). Свойство FireInfoMessageEventOnUserErrors
и событие InfoMessage
гарантируют, что код C # перехватывает эти сообщения во время выполнения, а не только в конце.
Вот некоторый код из MSDN с использованием SMO. Эта ссылка объясняет, как контролировать прогресс.