2015-07-21 68 views
0

我试图创建数据库备份并恢复到另一个数据库,备份正在工作但恢复失败,原因是我在创建备份时创建的数据库名称也像 使用主 创建数据库[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

我比较你的代码,所不同的只是你声明的字符串(字符串数据库名=“TEST”; 字符串文件名=“TEST.bak”;)保持,因为它是...? –

+0

我试过手动恢复数据库到另一个数据库,即使它不恢复,它'创建相同的数据库(我创建备份),我认为当创建备份创建数据库命令也添加,所以它试图创建为新的,而不是恢复..你有任何想法如何解决这个.. –

0

我在Asp.net应用程序中使用了这个解决方案。我的备份&恢复目标已修复。只需使用File Browse控件即可获取备份文件的名称。在使用此解决方案之前,只需添加一些dll。您可以从安装SQL Server的路径中获取这些dll。我的SQL Server位于D:\ Program Files(x86)\ Microsoft SQL Server。所以我得到d的dll:\程序文件(x86)\ Microsoft SQL Server的\ 110个\ SDK \组件。

就包括到您的项目解决方案参考以下DLL文件。

我的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; 
       } 
      } 
相关问题