2010-06-29 30 views

Trả lời

25

Dưới đây là một giải pháp ADO.NET tinh khiết, nếu bạn đang gặp khó khăn trong cài đặt SMO/SQLDMO trên máy mục tiêu (đó là một cơn đau ở phía sau, tốt nhất nên tránh nếu bạn có thể).

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("'", "''") + "'"; 
} 

Mệnh stats = 1 nói với SQL Server để phát ra mức độ nghiêm trọng 0 thư cùng khoảng thời gian tỷ lệ phần trăm nhất định (trong trường hợp này 1%). Sự kiện FireInfoMessageEventOnUserErrors và sự kiện InfoMessage đảm bảo rằng mã C# chụp các thông báo này trong khi thực thi thay vì chỉ ở cuối.

+0

Tôi đã tìm kiếm một cái gì đó như thế này trong một thời gian khá ... là phiên bản Restore này khác nhiều? Phần nào của thông báo thông báo cho biết tỷ lệ phần trăm tiến bộ thực tế là gì? – Patrick

+2

Lệnh khôi phục rất giống nhau, ví dụ: '" khôi phục cơ sở dữ liệu {0} từ đĩa = {1} với thay thế, số liệu thống kê = 1 "'. Đối với giá trị phần trăm, cá nhân tôi chỉ sử dụng một regex trên tin nhắn, ví dụ: 'Regex.Match (e.Message," (\ d {1,3}) phần trăm ")'. –

1

Đây là some code từ MSDN bằng SMO. This link giải thích cách theo dõi tiến độ.

Các vấn đề liên quan