2010-11-18 26 views
14

intento restaurar la base de datos de esta manera:Cómo restaurar la base de datos de SQL Server a través del código de C

SQL = @"RESTORE DATABASE MyDataBase TO DISK='d:\MyDATA.BAK'"; 
       Cmd = new SqlCommand(SQL, Conn); 
       Cmd.ExecuteNonQuery(); 
       Cmd.Dispose(); 

pero siempre me sale error:

Msg 3102, Level 16, State 1, Line 7
RESTORE cannot process database 'MyDataBase ' because it is in use by this session. It is recommended that the master database be used when performing this operation.
Msg 3013, Level 16, State 1, Line 7
RESTORE DATABASE is terminating abnormally.

Respuesta

1

debe conectar con el servidor de base de datos a través de una diferente base de datos.

Así la cadena de conexión que debe tomar para decir "Maestro" o otra base de datos en el servidor, a continuación, puede completar la tarea en cuestión.

1

Su cadena de conexión debe tener una base de datos master como catálogo predeterminado para conectarse a.

12

Su conexión de base de datos es más probable a la base de datos que está tratando de restaurar. Así que hay una base de datos de bloqueo que impide la restauración de su base de datos compartida

Prueba este

SQL = @"USE master BACKUP DATABASE MyDataBase TO DISK='d:\MyDATA.BAK'"; 

o cambiar los detalles de la conexión de usar maestro DB

+0

lo siento !!! i necesidad de restaurar de que este intento: RESTORE MyDatabase BASE DE DATOS DE DISCO = 'D: \ MyDatabase.bak' y consiguió este error – Gold

+0

de que este intento: MAESTRO RESTABLECIMIENTO DE USO PARA MyDatabase DISK = 'd: \ MyDATA.BAK pero sigue recibiendo este error: Msg 3159, nivel 16, estado 1, línea 7 No se ha realizado una copia de seguridad de la cola del registro de la base de datos "MyDataBase". Utilice el REGISTRO DE RESPALDO CON NORECOVERY para hacer una copia de seguridad del registro si contiene un trabajo que no desea perder. Utilice la cláusula WITH REPLACE o WITH STOPAT de la instrucción RESTORE para sobrescribir el contenido del registro. Msg 3013, nivel 16, estado 1, línea 7 RESTAURAR BASE DE DATOS está terminando anormalmente. – Gold

14

Yo prefiero usar SMO para restaurar una copia de seguridad:

Microsoft.SqlServer.Management.Smo.Server smoServer = 
    new Server(new ServerConnection(server)); 

Database db = smoServer.Databases['MyDataBase']; 
string dbPath = Path.Combine(db.PrimaryFilePath, 'MyDataBase.mdf'); 
string logPath = Path.Combine(db.PrimaryFilePath, 'MyDataBase_Log.ldf'); 
Restore restore = new Restore(); 
BackupDeviceItem deviceItem = 
    new BackupDeviceItem('d:\MyDATA.BAK', DeviceType.File); 
restore.Devices.Add(deviceItem); 
restore.Database = backupDatabaseTo; 
restore.FileNumber = restoreFileNumber; 
restore.Action = RestoreActionType.Database; 
restore.ReplaceDatabase = true; 
restore.SqlRestore(smoServer); 

db = smoServer.Databases['MyDataBase']; 
db.SetOnline(); 
smoServer.Refresh(); 
db.Refresh(); 

tendrá referencias a Microsoft.SqlServer.Smo, Microsoft.SqlServer.SmoExtended y Microsoft.SqlServer.Management.Sdk.Sfc

+2

En mi máquina, las DLL necesarias para acceder a estas bibliotecas estaban en C: \ Archivos de programa (x86) \ Microsoft SQL Server \ 110 \ SDK \ Assemblies (porque tengo SQL Server Management Studio instalado como parte de SQL Server Express 2008 R2), y necesitaba buscar en esta carpeta y agregar: Microsoft.SqlServer.ConnectionInfo.dll, Microsoft.SqlServer.Management.Sdk.Sfc.dll, Microsoft.SqlServer.Smo.dll, Microsoft.SqlServer.SmoExtended.dll. –

+1

¿Por qué las líneas dbPath y logPath? No parecen necesarios. También puede hacer que esto un poco más concisa utilizando restore.Devices.AddDevice (y pasando los argumentos que utilizó en nueva BackupDeviceItem –

+0

@ChrisMoschini Creo que se refería a hacer algo como: RelocateFile relocateDataFile = new RelocateFile (restore.ReadFileList (smoServer). Filas [0] [0] .ToString(), dbPath); restore.RelocateFiles.Add (relocateDataFile); – petric

Cuestiones relacionadas