Tengo un SQL 2008 DB. Estoy ejecutando un formulario que respalda ese DB, luego intenta actualizarlo. Si la actualización falla, la idea es restaurar esa copia de seguridad. Aquí está el código que estoy usando para restaurar la copia de seguridad.Cómo restaurar una base de datos desde C#
public void RestoreDatabase(String databaseName, String backUpFile, String serverName, String userName, String password)
{
Restore sqlRestore = new Restore();
BackupDeviceItem deviceItem = new BackupDeviceItem(backUpFile, DeviceType.File);
sqlRestore.Devices.Add(deviceItem);
sqlRestore.Database = databaseName;
ServerConnection connection = new ServerConnection(serverName, userName, password);
Server sqlServer = new Server(connection);
sqlRestore.Action = RestoreActionType.Database;
string logFile = System.IO.Path.GetDirectoryName(backUpFile);
logFile = System.IO.Path.Combine(logFile, databaseName + "_Log.ldf");
string dataFile = System.IO.Path.GetDirectoryName(backUpFile);
dataFile = System.IO.Path.Combine(dataFile, databaseName + ".mdf");
Database db = sqlServer.Databases[databaseName];
RelocateFile rf = new RelocateFile(databaseName, dataFile);
sqlRestore.RelocateFiles.Add(new RelocateFile(databaseName, dataFile));
sqlRestore.RelocateFiles.Add(new RelocateFile(databaseName + "_log", logFile));
sqlRestore.SqlRestore(sqlServer);
db = sqlServer.Databases[databaseName];
db.SetOnline();
sqlServer.Refresh();
}
El problema parece ser que los nombres de archivo que selecciono son diferentes a los de la base de datos en línea. Básicamente, quiero reemplazar la base de datos en el servidor con la copia de seguridad. Obtengo una excepción cuando llamo a SqlRestore.
La principal excepción dice
{ "Error en la restauración para el servidor 'localhost'."}
Excavando en las excepciones internas muestra estos errores
ha producido una excepción al ejecutar una instrucción o lote de Transact-SQL.
y luego
archivo lógico 'DB' no es parte de la base de datos 'DB'. Utilice RESTORE FILELISTONLY para listar el archivo lógico nombres. \ R \ nRESTORE DATABASE es terminando anormalmente.
Supongo que hay alguna manera de decir que simplemente use reemplazar el DB existente como está.
Utilizo este código para que la ruta del archivo del DB tenga un directorio para volcar la copia de seguridad. Tal vez esto podría usarse para hacer que los nombres de los archivos se vuelvan a crear.
public string GetDBFilePath(String databaseName, String userName, String password, String serverName)
{
ServerConnection connection = new ServerConnection(serverName, userName, password);
Server sqlServer = new Server(connection);
Database db = sqlServer.Databases[databaseName];
return sqlServer.Databases[databaseName].PrimaryFilePath;
}
No necesita reubicar archivos si restaura desde una copia de seguridad de la misma base de datos en la misma máquina.La reubicación solo es necesaria cuando se mueven y copian bases de datos a través de una copia de seguridad/restauración. –
Ok, aquí algunos consejos: con respecto a la ruta del archivo de copia de seguridad, siempre preste atención si el archivo realmente existe en su carpeta de origen. Con respecto a la reubicación, podría ser un problema de permiso para escribir un archivo mdf. Preste atención si su aplicación tiene permiso para leer el archivo .bak, en este caso, consulte el Administrador de configuración SQL: el servicio MSSQLServer debe ejecutarse bajo el usuario LocalSystem. –