2015-07-21 3 views
0

Я попытался создать резервное копирование и восстановление базы данных в другую базу данных, резервное копирование работает, но восстановление не выполняется. Причина, когда я создаю резервную копию, также создает имя базы данных, USE Мастер Создание базы данных [Samplename] Тогда генерации всех таблиц данных так что, когда я пытаюсь восстановить с помощью C#, это попытаться Создание новой БД, как Samplename не мой новый SampleDB, то это дает исключениеКак восстановить файл Sqlserver .bak с новым именем базы данных с помощью C#

The file 'C:\Program Files (x86)\Microsoft SQL  
    Server\MSSQL11.BIZSQL\MSSQL\DATA\Product Company.mdf' cannot be 
overwritten. It is being used by database 'Sample Product Company'. 
    File 'Sample Product Company' cannot be restored to 'C:\Program Files 
(x86)\Microsoft SQL Server\MSSQL11.BIZSQL\MSSQL\DATA\Sample Product 
Company.mdf'. Use WITH MOVE to identify a valid location for the file. 

The file 'C:\Program Files (x86)\Microsoft SQL 
Server\MSSQL11.BIZSQL\MSSQL\DATA\Sample Product Company_log.ldf' cannot be overwritten. 
It is being used by database 'Sample Product Company'. 

File 'Sample Product Company_log' cannot be restored to 'C:\Program Files 
(x86)\Microsoft SQL Server\MSSQL11.BIZSQL\MSSQL\DATA\Sample Product 
Company_log.ldf'. Use WITH MOVE to identify a valid location for the file. 

Problems were identified while planning for the RESTORE statement. Previous  
messages provide details. 

    RESTORE DATABASE is terminating abnormally. 

Вы можете руководствоваться мне, как восстановить базу данных с помощью новой базы данных в SQlser2012R2

Пример кода для восстановления:

 using (SqlConnection con = new SqlConnection(ConnectionString)) 
      { 
       con.Open(); 

       string UseMaster = "USE master"; 
       SqlCommand UseMasterCommand = new SqlCommand(UseMaster, con); 
       UseMasterCommand.ExecuteNonQuery(); 
       int iReturn = 0; 

       // If the database does not exist then create it. 
       string strCommand = string.Format("SET NOCOUNT OFF; SELECT COUNT(*) FROM master.dbo.sysdatabases where name=\'{0}\'", DatabaseName); 
       using (SqlCommand sqlCmd = new SqlCommand(strCommand, con)) 
       { 
        iReturn = Convert.ToInt32(sqlCmd.ExecuteScalar()); 
       } 
       if (iReturn == 0) 
       { 
        SqlCommand command = con.CreateCommand(); 
        command.CommandText = "CREATE DATABASE " + DatabaseName; 
        command.ExecuteNonQuery(); 
       } 
       ServerConnection serverConnection = new ServerConnection(con); 
       Microsoft.SqlServer.Management.Smo.Server srv = new Microsoft.SqlServer.Management.Smo.Server(serverConnection); 
       string Alter1 = @"ALTER DATABASE [" + DatabaseName + "] SET Single_User WITH Rollback Immediate"; 
       SqlCommand Alter1Cmd = new SqlCommand(Alter1, con); 
       Alter1Cmd.ExecuteNonQuery(); 
       string Restore = @"RESTORE Database [" + DatabaseName + "] FROM DISK = N'" + fileName + @"' WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 10"; 
       SqlCommand RestoreCmd = new SqlCommand(Restore, con); 
       RestoreCmd.ExecuteNonQuery(); 
       string Alter2 = @"ALTER DATABASE [" + DatabaseName + "] SET Multi_User"; 
       SqlCommand Alter2Cmd = new SqlCommand(Alter2, con); 
       Alter2Cmd.ExecuteNonQuery(); 




      } 
+0

Я проверил ваш код, и я не получаю никаких исключений, и восстановление будет успешным. Когда вы отлаживаете, какое значение у вас есть для переменной «fileName» – StackTrace

+0

Имя файла: RestoreBackup. Я создаю резервную копию на другом компьютере и пытаюсь восстановить ее в своей системе, тогда она работает правильно, но если я вернусь на свою машину и восстановление ее не работает, то у меня есть Windows8.1 и Sqlserver2012 R2, а на другой машине есть Windows7 и Sqlserver2012R2 .. –

ответ

0

Немного измененная версия кода ниже работает формировать меня.

  string connectionString = ConfigurationManager.ConnectionStrings["TESTConnectionString"].ConnectionString; 
      using (SqlConnection con = new SqlConnection(connectionString)) 
      { 
       con.Open(); 

       string DatabaseName = "TEST"; 
       string fileName = "TEST.bak"; 

       string UseMaster = "USE master"; 
       SqlCommand UseMasterCommand = new SqlCommand(UseMaster, con); 
       UseMasterCommand.ExecuteNonQuery(); 
       int iReturn = 0; 

       // If the database does not exist then create it. 
       string strCommand = string.Format("SET NOCOUNT OFF; SELECT COUNT(*) FROM master.dbo.sysdatabases where name=\'{0}\'", DatabaseName); 
       using (SqlCommand sqlCmd = new SqlCommand(strCommand, con)) 
       { 
        iReturn = Convert.ToInt32(sqlCmd.ExecuteScalar()); 
       } 
       if (iReturn == 0) 
       { 
        SqlCommand command = con.CreateCommand(); 
        command.CommandText = "CREATE DATABASE " + DatabaseName; 
        command.ExecuteNonQuery(); 
       } 
       ServerConnection serverConnection = new ServerConnection(con); 
       Microsoft.SqlServer.Management.Smo.Server srv = new Microsoft.SqlServer.Management.Smo.Server(serverConnection); 
       string Alter1 = @"ALTER DATABASE [" + DatabaseName + "] SET Single_User WITH Rollback Immediate"; 
       SqlCommand Alter1Cmd = new SqlCommand(Alter1, con); 
       Alter1Cmd.ExecuteNonQuery(); 
       string Restore = @"RESTORE Database [" + DatabaseName + "] FROM DISK = N'" + fileName + @"' WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 10"; 
       SqlCommand RestoreCmd = new SqlCommand(Restore, con); 
       RestoreCmd.ExecuteNonQuery(); 
       string Alter2 = @"ALTER DATABASE [" + DatabaseName + "] SET Multi_User"; 
       SqlCommand Alter2Cmd = new SqlCommand(Alter2, con); 
       Alter2Cmd.ExecuteNonQuery(); 
      } 
+1

«работает на моей машине» почти никогда не помогает OP .. Не могли бы вы определить изменения, которые вы сделали, чтобы вам не приходилось сравнивать код OPs с вашим вручную? – Default

+0

Я сравниваю ваш код, разница только в том, что вы объявляете строки (строка DatabaseName = "TEST"; строка fileName = "TEST.bak";) осталась, как есть ..? –

+0

Я попытался вручную восстановить базу данных в другой БД, даже если он не восстанавливается, это «создание той же БД (которую я создаю резервную копию), я думал, что при создании резервной копии создается команда базы данных, добавленная, поэтому она пытается создать как новую, а не восстанавливать У вас есть идея, как это решить. –

0

Я использовал это решение в приложении Asp.net. Моя резервная копия & Исправление восстановления исправлено. Просто используйте элемент «Обзор файлов», чтобы получить имя файла резервной копии. Перед использованием этого решения нужно просто добавить dll. Вы можете получить эти DLL с пути, где вы устанавливаете SQL Server. Мой SQL Server находится по адресу D: \ Program Files (x86) \ Microsoft SQL Server. Итак, я получаю dll от D: \ Program Files (x86) \ Microsoft SQL Server \ 110 \ SDK \ Assemblies.

Просто включите следующую длл файл для справки решения проекта.

Мой SQL Server 2008 R2 и 2012 R2. В обоих случаях это решение работает нормально.

using Microsoft.SqlServer.Management; 
using Microsoft.SqlServer.Management.Smo; 
using Microsoft.SqlServer.Management.Smo.Agent; 
using Microsoft.SqlServer.Management.Smo.Broker; 
using Microsoft.SqlServer.Management.Smo.Mail; 
using Microsoft.SqlServer.Management.Smo.RegisteredServers; 
using Microsoft.SqlServer.Management.Sdk.Sfc; 
using Microsoft.SqlServer.Management.Common; 



protected void btnDatabaseRestore_Click(object sender, EventArgs e) 
      { 
       try 
       { 

        string fileName = fileBrowsingForBackup.FileName; // Browse The Backup File From Device     

        string restorePath = string.Empty, userName = string.Empty, password = string.Empty, serverName = string.Empty, databaseName = string.Empty; 
        string backFileName = string.Empty, dataFilePath = string.Empty, logFilePath = string.Empty; 

        databaseName = "innboard20151215020030";// For Example Restore File Name innboard20151215020030.bak 

        restorePath = Server.MapPath(@"~/DatabaseBackup/"); // I used the folder for Restore The Database 

        dataFilePath = restorePath; 
        logFilePath = restorePath; 
        restorePath += databaseName + ".bak"; // Get the Backup File Path 

        databaseName = "innboard20151215020031"; // I want to Restore The Database name as "innboard20151215020031" 

//Get The Database Server Name, UserId, Passsword 

        string encryptedConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["InnboardConnectionString"].ConnectionString; 
        string decryptedConnectionString = Cryptography.Decrypt(encryptedConnectionString); 

        string[] wordConnectionString = decryptedConnectionString.Split(';'); 

        string mInitialCatalog = wordConnectionString[0]; 
        string mDataSource = wordConnectionString[1]; 
        string mUserId = wordConnectionString[2]; 
        string mPassword = wordConnectionString[3]; 

        string mInitialCatalogValue = mInitialCatalog.Split('=')[1]; 
        string mDataSourceValue = mDataSource.Split('=')[1]; 
        string mUserIdValue = mUserId.Split('=')[1]; 
        string mPasswordValue = mPassword.Split('=')[1]; 

        userName = mUserIdValue; 
        password = mPasswordValue; 
        serverName = mDataSourceValue; 

        // Call The Database Restore Method 
        RestoreDatabase(databaseName, restorePath, serverName, userName, password, dataFilePath, logFilePath); 

        CommonHelper.AlertInfo(innboardMessage, "Restore Database Succeed.", "success"); 
       } 
       catch (Exception ex) 
       { 
        CommonHelper.AlertInfo(innboardMessage, ex.InnerException.ToString(), "error"); 
       } 
      } 

// Database Restore Method 

    public void RestoreDatabase(String databaseName, String filePath, String serverName, String userName, String password, String dataFilePath, String logFilePath) 
      { 
       try 
       { 
//Action Type 
        Restore sqlRestore = new Restore(); 

        BackupDeviceItem deviceItem = new BackupDeviceItem(filePath, DeviceType.File); 
        sqlRestore.Devices.Add(deviceItem); 
        sqlRestore.Database = databaseName; 

        ServerConnection connection = new ServerConnection(serverName, userName, password); 
        Server sqlServer = new Server(connection); 

        Database db = sqlServer.Databases[databaseName]; 
        sqlRestore.Action = RestoreActionType.Database; 

//Create The Restore Database Ldf & Mdf file name 
        String dataFileLocation = dataFilePath + databaseName + ".mdf"; 
        String logFileLocation = logFilePath + databaseName + "_Log.ldf"; 
        db = sqlServer.Databases[databaseName]; 
        RelocateFile rf = new RelocateFile(databaseName, dataFileLocation); 

// Replace ldf, mdf file name of selected Backup file (in that case innboard20151215020030.bak) 
        System.Data.DataTable logicalRestoreFiles = sqlRestore.ReadFileList(sqlServer); 
        sqlRestore.RelocateFiles.Add(new RelocateFile(logicalRestoreFiles.Rows[0][0].ToString(), dataFileLocation)); 
        sqlRestore.RelocateFiles.Add(new RelocateFile(logicalRestoreFiles.Rows[1][0].ToString(), logFileLocation)); 

        sqlRestore.ReplaceDatabase = true; 

        sqlRestore.SqlRestore(sqlServer); 
        db = sqlServer.Databases[databaseName]; 
        db.SetOnline(); 
        sqlServer.Refresh(); 
       } 
       catch (Exception ex) 
       { 
        throw; 
       } 
      } 

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

  • Нет связанных вопросов^_^