Como comenzar. Bueno... en estos días he tenido que realizar un proyecto para realizar copias de seguridad de unas bases de datos, con lo que implica tambén crear un sistema de restauración.
En SQLServer existen unos objectos llamados jobs con los que podemos "decirle" a SQL que realice unas copias de seguridad, pero... en SQLExpress 2005 esta opción no existe.
Librerias a usar Estas librerias se incluyen en referencias del proyecto en .NET:
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
Backup Database
private Server GetServer() {
ServerConnection conn =
new ServerConnection("Serer", "user", "pass");
Server myServer = new Server(conn);
return myServer;
}
public void backupDB(object data) {
backupItem item = (backupItem)data;
if (changeDBEnv != null)
changeDBEnv(item.DbName, EventArgs.Empty);
Console.WriteLine("Backup the {0} database!", item.DbName);
Server myServer = GetServer();
Backup backup = new Backup();
backup.Action = BackupActionType.Database;
backup.Database = item.DbName;
item.BackupPath =
System.IO.Path.Combine(item.BackupPath, item.DbName + ".bak");
backup.Devices.Add(new BackupDeviceItem(item.BackupPath, DeviceType.File));
backup.Initialize = true;
backup.Checksum = true;
backup.ContinueAfterError = true;
backup.Incremental = false;
backup.LogTruncation = BackupTruncateLogType.Truncate;
backup.PercentComplete +=
new PercentCompleteEventHandler(backup_PercentComplete);
backup.Complete +=
new ServerMessageEventHandler(backup_Complete);
backup.SqlBackup(myServer);
}
Restore Database
public void RestoreDB(string file, string db) {
try {
Console.WriteLine("Restore the {0} database!", db);
if (changeDBEnv != null)
changeDBEnv(db, EventArgs.Empty);
Server myServer = GetServer();
Restore restore = new Restore();
restore.Action = RestoreActionType.Database;
restore.Database = db;
Database currentDb = myServer.Databases[db];
if (currentDb != null)
myServer.KillAllProcesses(db);
restore.Devices.AddDevice(file, DeviceType.File);
restore.ReplaceDatabase = true;
restore.PercentCompleteNotification = 10;
restore.PercentComplete +=
new PercentCompleteEventHandler(restore_PercentComplete);
restore.Complete +=
new ServerMessageEventHandler(restore_Complete);
Console.WriteLine("Restoring:{0}" + db);
restore.SqlRestore(myServer);
currentDb = myServer.Databases[db];
currentDb.SetOnline();
} catch(System.Data.SqlClient.SqlException e) {
log.WriteToLogAndConsole(e.Message);
}
}
Este código no funciona tal cual ya que faltan una serie de eventos que yo tenía. Simplemente hay que quitar lo que esta después de += incluidos estos y generarlos de nuevo.