c# - segundo - restaurar la base de datos
mvvm c# ejemplo (1)
Utilicé con éxito SMO
para restaurar la base de datos. Compartiré mi código. Espero eso ayude. Sin embargo, esta solución tiene una advertencia: considera que solo tiene un archivo de datos principal. Hacer coincidir los archivos de registro y datos es realmente complicado y puede salir mal de muchas maneras. De todos modos, intenta y avísame, esto ayuda.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Text;
using System.Threading;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.Win32;
namespace DatabaseUtility
{
public class BackupRestore
{
static Server srv;
static ServerConnection conn;
public static void BackupDatabase(string serverName, string databaseName, string filePath)
{
conn = new ServerConnection();
conn.ServerInstance = serverName;
srv = new Server(conn);
try
{
Backup bkp = new Backup();
bkp.Action = BackupActionType.Database;
bkp.Database = databaseName;
bkp.Devices.AddDevice(filePath, DeviceType.File);
bkp.Incremental = false;
bkp.SqlBackup(srv);
conn.Disconnect();
conn = null;
srv = null;
}
catch (SmoException ex)
{
throw new SmoException(ex.Message, ex.InnerException);
}
catch (IOException ex)
{
throw new IOException(ex.Message, ex.InnerException);
}
}
public static void RestoreDatabase(string serverName, string databaseName, string filePath)
{
conn = new ServerConnection();
conn.ServerInstance = serverName;
srv = new Server(conn);
try
{
Restore res = new Restore();
res.Devices.AddDevice(filePath, DeviceType.File);
RelocateFile DataFile = new RelocateFile();
string MDF = res.ReadFileList(srv).Rows[0][1].ToString();
DataFile.LogicalFileName = res.ReadFileList(srv).Rows[0][0].ToString();
DataFile.PhysicalFileName = srv.Databases[databaseName].FileGroups[0].Files[0].FileName;
RelocateFile LogFile = new RelocateFile();
string LDF = res.ReadFileList(srv).Rows[1][1].ToString();
LogFile.LogicalFileName = res.ReadFileList(srv).Rows[1][0].ToString();
LogFile.PhysicalFileName = srv.Databases[databaseName].LogFiles[0].FileName;
res.RelocateFiles.Add(DataFile);
res.RelocateFiles.Add(LogFile);
res.Database = databaseName;
res.NoRecovery = false;
res.ReplaceDatabase = true;
res.SqlRestore(srv);
conn.Disconnect();
}
catch (SmoException ex)
{
throw new SmoException(ex.Message, ex.InnerException);
}
catch (IOException ex)
{
throw new IOException(ex.Message, ex.InnerException);
}
}
public static Server Getdatabases(string serverName)
{
conn = new ServerConnection();
conn.ServerInstance = serverName;
srv = new Server(conn);
conn.Disconnect();
return srv;
}
}
}
Uso SQL Server SMO para restaurar un .bak a una nueva base de datos, pero no funcionó.
el servidor sql es 2012 y la versión smo object es de la última versión sdk 11.0
file .bak se creó utilizando sql management studio 2012, misma PC local, en la misma PC de codificación.
El mensaje de error que recibo es:
La restauración falló para el servidor ''SERVIDOR''.
¿Qué pasa con mi código?
string dbPath = Path.Combine(@"d:/my data", dbName + "_db" + ".mdf");
string logPath = Path.Combine(@"d:/my data", dbName + "_db" + "_Log.ldf");
Restore restore = new Restore();
BackupDeviceItem deviceItem = new BackupDeviceItem("d:/template.BAK", DeviceType.File);
restore.Devices.Add(deviceItem);
restore.Database = dbName + "_db";
RelocateFile relocateDataFile = new RelocateFile("Data", dbPath);
RelocateFile relocateLogFile = new RelocateFile("Log", logPath);
restore.RelocateFiles.Add(relocateDataFile);
restore.RelocateFiles.Add(relocateLogFile);
restore.Action = RestoreActionType.Database;
restore.ReplaceDatabase = true;
restore.SqlRestore(server);
ACTUALIZADO: entregué soluciones SMO e intenté
using (SqlConnection connection = new SqlConnection("Data Source=server;user id=sa;password=xxxxx;"))
{
using (SqlCommand command = new SqlCommand(@"RESTORE DATABASE beauty01 FROM DISK = ''d:/template.bak'' WITH RECOVERY, MOVE ''beauty1'' TO ''D:/MyData/beauty01_Data.mdf'', MOVE ''beauty1_log'' TO ''d:/Mydata/beauty01_Log.ldf'', REPLACE", connection))
{
connection.Open();
// Add the parameters for the SelectCommand.
command.CommandType = CommandType.Text;
command.ExecuteNonQuery();
}
} >> work good.
Gracias a todos.