lunes, 30 de abril de 2007

Crear y restaurar copias de seguridad en C# con SQLExpress 2005.

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;

Conexión al servidor

private Server GetServer() {
ServerConnection conn =

new ServerConnection("Serer", "user", "pass");
Server myServer = new Server(conn);
return myServer;
}

Backup Database

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.

No hay comentarios:

Publicar un comentario