2014-01-23 5 views
0

Я пытаюсь восстановить SQL сервер .bak в пустую базу данных, используя следующий C# код:Восстановление базы данных с помощью C# и SMO ​​

   string dbBakFile = GetBackFileFromZip(restoreConfig.TmpUnZipFolder,restoreConfig.DatabaseFileToRestore); 

      if (string.IsNullOrEmpty(dbBakFile)) 
      { 
       response.Status = DatabaseResponseStatus.Error; 
       response.Message = "No .bak file found in " + restoreConfig.DatabaseToRestore; 
       return response; 
      } 

      var builder = 
       new SqlConnectionStringBuilder(
        ConfigurationManager.ConnectionStrings["myserver"].ConnectionString); 

      var smoServer = 
       new Server(new ServerConnection(builder.DataSource,builder.UserID,builder.Password));     

      var db = smoServer.Databases[restoreConfig.DatabaseToRestore]; 

      if (db != null) 
      { 
       smoServer.KillAllProcesses(restoreConfig.DatabaseToRestore); 
       log.Debug("all processes on db killed"); 
      } 


      string dbPath = Path.Combine(db.PrimaryFilePath, restoreConfig.DatabaseToRestore + ".mdf"); 

      log.Debug("db path is " +dbPath); 

      string logPath = Path.Combine(db.PrimaryFilePath,restoreConfig.DatabaseToRestore + "_Log.ldf"); 

      log.Debug("log path is " + logPath); 

      var restore = new Restore(); 

      var deviceItem = 
       new BackupDeviceItem(dbBakFile, DeviceType.File); 

      restore.DatabaseFiles.Add(dbPath); 

      restore.DatabaseFiles.Add(logPath);    

      restore.Devices.Add(deviceItem); 

      restore.Database = restoreConfig.DatabaseToRestore; 

      restore.FileNumber = 1; 

      restore.Action = RestoreActionType.Files; 

      restore.ReplaceDatabase = true; 

      restore.PercentCompleteNotification = 10; 

      restore.PercentComplete +=restore_PercentComplete; 

      restore.Complete += restore_Complete; 

      restore.SqlRestore(smoServer); 

      db = smoServer.Databases[restoreConfig.DatabaseToRestore]; 

      db.SetOnline(); 

      smoServer.Refresh(); 

      db.Refresh(); 

Я получаю следующее сообщение об ошибке:

Microsoft.SqlServer.Management.Smo.FailedOperationException: Restore failed for Server 'IM-M4500\SQLEXPRESS'. ---> Microsoft.SqlServer.Management.Smo.SmoException: System.Data.SqlClient.SqlError: The backup set holds a backup of a database other than the existing 'new-test-44444' database 

Да он держит другую резервную копию, и я хочу перезаписать и заменить ее, также хочу переместить файлы mdf и log в новые файлы. Я что-то упустил в вариантах восстановления?

Большое спасибо

Исмаил

ответ

0

Не создавайте новую базу данных и попытаться восстановить его. Вместо этого используйте приведенный ниже запрос.

RESTORE DATABASE dbname from disk='location' WITH MOVE 'data' TO 'name.mdf' MOVE '_Log' TO 'name_log.ldf' 

Чтобы заменить существующую базу данных, ее имя на DBNAME и использовать WITH REPLACE на запросе

+0

Danson, благодарю вас за ответ. Просто чтобы дать вам немного больше информации, у меня есть процесс, когда пользователи заполняют форму и создают для них iis-сайт и новый пустой db. После этого процесса, если у них есть существующий db, я хочу, чтобы они могли восстановить этот db. Процесс создания использует соглашение об именах для сайта и db, и я хочу сохранить это и просто написать db поверх вновь созданного db. Нет ли способа сделать это с помощью tsql? Я попробовал ваш sql, и я все равно получаю такую ​​же ошибку. Спасибо Ismail – Ismail

1

Ok фиксированного вопрос, мне нужно, чтобы дать ему текущее дб логического имени файла, что я был на самом деле делаю давал ему новое имя логического файла db, поэтому

  //get the logical file names 
      DataTable dtFileList = restore.ReadFileList(smoServer); 

      string dbLogicalName = dtFileList.Rows[0][0].ToString(); 

      string logLogicalName = dtFileList.Rows[1][0].ToString(); 

      restore.RelocateFiles.Add(GetRelocateFile(dbLogicalName, dbPath)); 

      restore.RelocateFiles.Add(GetRelocateFile(logLogicalName, logPath)); 

Это работает красиво.

Смежные вопросы